ฉันจะบอกได้อย่างไรว่าแพ็คเกจใดที่ต้องรีบูตระบบ?


85

ฉันได้unattended-upgradeตั้งค่าระบบ Ubuntu ของฉันแล้ว บางครั้งฉันจะลงชื่อเข้าใช้จากระยะไกลหนึ่งในนั้นและฉันจะเห็นข้อความแจ้งให้ฉันทราบว่าฉันต้องรีบูตระบบ (เพื่อทำการอัปเกรดให้เสร็จสมบูรณ์) มีวิธีในการพิจารณาแพ็คเกจเฉพาะ (หรือชุดของแพ็คเกจ) ที่เรียกใช้ประกาศนี้หรือไม่?

คำตอบ:


80

เวอร์ชั่นสั้น:

cat /var/run/reboot-required.pkgs

คำอธิบาย:

ดูเหมือนว่ามีวิธีที่ง่ายในการแยกข้อมูลที่ต้องการโดยอัตโนมัติ

ภายใน.debไฟล์มีไฟล์ควบคุมสำหรับการติดตั้งรวมถึงpostinst(เรียกใช้หลังจากการติดตั้ง)

ยกตัวอย่างเช่นในlinux-image-2.6.35-25-generic_2.6.35-25.44_amd64.deb,
postinstรวมถึง

my $notifier          = "/usr/share/update-notifier/notify-reboot-required";

my $warn_reboot     = 'Yes';     # Warn that we are installing a version of
                                 # the kernel we are running

และ

# Warn of a reboot
if (-x $notifier) {
 system($notifier);
}

สคริปต์เปลือก /usr/share/update-notifier/notify-reboot-requiredการปรับปรุงและ
/var/run/reboot-required /var/run/reboot-required.pkgs

ไฟล์หลังมีรายการแพ็กเกจที่ร้องขอการรีบูต


1
ในระบบของฉันไฟล์/var/run/reboot-requiredถูกสร้างขึ้นหนึ่งวันก่อนหน้านี้ แต่ไม่มี/var/run/reboot-required.pkgsไฟล์ @ Ubuntu 16.04.5 LTS
Lion

25

แนะนำให้รีบูตเครื่องunattended-upgradesเมื่อเห็นว่ามี/var/run/reboot-requiredอยู่แล้ว ไฟล์ถูกสร้างขึ้นโดยpostinstสคริปต์ (หลังการติดตั้ง) ในบางแพ็คเกจดูเหมือนว่า:

[ -x /usr/share/update-notifier/notify-reboot-required ] && \
/usr/share/update-notifier/notify-reboot-required || true

หากคุณต้องการดูแพ็คเกจที่ทริกเกอร์คุณสามารถดูเนื้อหาของ/var/run/reboot-required.pkgsไฟล์ได้

สำหรับข้อมูลเพิ่มเติมโปรดดูหัวข้อนี้


2

จากคำตอบก่อนหน้าของ Olli ฉันพบวิธีหาแพ็คเกจที่ติดตั้งอยู่ในระบบของคุณซึ่งต้องรีบู๊ต

~$ mkdir debs
~$ cd debs
~/debs$ apt-get download $(dpkg -l | tail -n +7 | awk '{print $2}')

รอให้การดาวน์โหลดเสร็จสมบูรณ์ในระบบของฉันมันมีขนาดประมาณ 900 MB ดังนั้นอาจใช้เวลาสักครู่ขึ้นอยู่กับการเชื่อมต่อของคุณ แล้ว:

~/debs$ for x in $(ls); do y=$(dpkg-deb -I "$x" postinst 2>/dev/null | grep 'reboot-required'); if [ -n "$y" ]; then echo "$x" | grep -Poe '^.*?(?=_)'; fi; done

ผลลัพธ์อาจมีลักษณะดังนี้:

dbus
gconf2
initscripts
libc6
libpam0g
libpam-systemd
libssl1.0.0
linux-image-3.19.0-47-generic
linux-image-3.19.0-49-generic
network-manager
upstart

แน่นอนวิธีนี้ไม่สามารถจะเข้าใจผิดได้ อาจมีแพ็กเกจที่แจ้งเกี่ยวกับการรีบู๊ตที่จำเป็นด้วยวิธีการอื่นนอกเหนือจาก 'การแจ้งเตือนการรีบู๊ตที่จำเป็น' และในขณะที่รายการนี้แสดงว่าแพ็คเกจใดที่ติดตั้งอยู่ในปัจจุบันต้องการหรือไม่ต้องการรีบู๊ต แพ็คเกจรุ่นเดียวกัน


3
คุณสามารถทำเช่นเดียวกันโดยไม่ต้องดาวน์โหลดที่น่าเบื่อเพียงแค่grep -l reboot-required /var/lib/dpkg/info/*.postinst | sed -e 's,^.*/\(.*\)\.postinst,\1,'นั้น อย่างไรก็ตามโปรดทราบว่าจะรายงานเฉพาะแพ็คเกจที่อาจต้องรีบูตในบางครั้งเท่านั้นแพคเกจใดที่ไม่ต้องรีบูตในครั้งนี้
Matija Nalis

0

ฉันไม่รู้จริงๆว่ามีแพ็กเกจอื่น ๆ ที่ต้องทำการรีบูตหรือไม่ แต่การอัพเดทเคอร์เนลจะทำตลอดเวลา ฉันจะบอกว่าเกือบทุกครั้งที่ฉันถูก "ขอ" รีบูตเคอร์เนลได้รับการปรับปรุง


1
นั่นไม่ดีพอในความคิดของฉัน การอัปเดต Bootloader ยังร้องขอการรีบู๊ตเช่นเดียวกับ init (upstart)
Olli

1
ดียังมีบางส่วนแพคเกจอื่น ๆ เช่น DBus: ubuntu.com/usn/USN-799-1 ดังนั้นการรวบรวมรายชื่อแพคเกจที่ต้องรีสตาร์ท (DBus ไม่จำเป็นต้องใช้ทุกครั้ง) จึงเป็นเรื่องโง่สำหรับวิธีแก้ปัญหาที่สมบูรณ์
Olli

1
คุณถูกต้อง ... Mine เป็นความรู้บางส่วน :( ขอบคุณสำหรับข้อมูลฉันไม่ได้ตระหนักถึงแพคเกจอื่น ๆ ที่จำเป็นต้องเริ่มต้นใหม่ด้วย
luri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.