Làm thế nào tôi có thể biết gói nào yêu cầu khởi động lại hệ thống của tôi?


85

Tôi đã unattended-upgradethiết lập trên các hệ thống Ubuntu của mình. Thỉnh thoảng tôi sẽ đăng nhập từ xa vào một trong số họ và tôi sẽ thấy một thông báo cho tôi biết rằng tôi cần khởi động lại hệ thống (để hoàn tất nâng cấp). Có cách nào để xác định gói cụ thể (hoặc bộ gói) đang kích hoạt thông báo này không?

Câu trả lời:


80

Phiên bản ngắn:

cat /var/run/reboot-required.pkgs

Giải trình:

Có vẻ như có một cách dễ dàng để tự động trích xuất thông tin được yêu cầu.

Bên trong .debcác tệp có các tệp điều khiển để cài đặt, bao gồm postinst(chạy sau khi cài đặt).

Ví dụ: trong linux-image-2.6.35-25-generic_2.6.35-25.44_amd64.deb,
postinstbao gồm

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);
}

Kịch bản shell /usr/share/update-notifier/notify-reboot-requiredcập nhật
/var/run/reboot-required /var/run/reboot-required.pkgs .

Tệp sau chứa danh sách các gói yêu cầu khởi động lại.


1
Trên hệ thống của tôi, tệp /var/run/reboot-requiredđã được tạo trước đó một ngày nhưng không có /var/run/reboot-required.pkgstệp @ Ubuntu 16.04.5 LTS.
Sư tử

25

Khởi động lại được khuyến nghị bởi unattended-upgradeskhi nó thấy rằng /var/run/reboot-requiredtồn tại. Các tập tin được tạo bởi postinstcác kịch bản (cài đặt sau) trong một số gói, nó trông giống như thế này:

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

Nếu bạn muốn xem gói nào kích hoạt điều này, bạn có thể xem nội dung của /var/run/reboot-required.pkgstệp.

Để biết thêm thông tin cũng xem chủ đề này .


2

Dựa trên câu trả lời trước đó của Olli, tôi đã đưa ra một phương pháp để tìm tất cả các gói hiện được cài đặt trên hệ thống của bạn yêu cầu khởi động lại.

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

Đợi quá trình tải xuống hoàn tất, trên hệ thống của tôi có dung lượng khoảng 900 MB nên có thể mất một lúc tùy thuộc vào kết nối của bạn. Sau đó:

~/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

Đầu ra có thể trông giống như thế này:

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

Tất nhiên, phương pháp này không phải là hoàn hảo. Có thể có các gói thông báo về việc khởi động lại được yêu cầu thông qua các phương tiện khác ngoài 'thông báo khởi động lại bắt buộc', và trong khi điều này cho thấy các gói hiện đang cài đặt yêu cầu hoặc không yêu cầu khởi động lại, thì điều đó không chắc chắn sẽ đúng cho lần sau các phiên bản của cùng một gói.


3
Bạn có thể hoàn thành tương tự mà không cần tải xuống tẻ nhạt grep -l reboot-required /var/lib/dpkg/info/*.postinst | sed -e 's,^.*/\(.*\)\.postinst,\1,'. Tuy nhiên, xin lưu ý rằng nó sẽ chỉ báo cáo gói nào có thể yêu cầu khởi động lại vào một lúc nào đó, không phải gói nào yêu cầu khởi động lại lần này
Matija Nalis

0

Tôi thực sự không biết nếu có các gói khác yêu cầu khởi động lại, nhưng cập nhật kernel luôn làm. Tôi đã nói gần như mỗi lần tôi được "yêu cầu" khởi động lại, kernel đã được cập nhật.


1
Điều đó không đủ tốt theo ý kiến ​​của tôi. Cập nhật Bootloader cũng yêu cầu khởi động lại, cũng như init (khởi động).
Olli

1
Chà, cũng có một số gói khác, như DBus: ubfox.com/usn/USN-799-1 . Vì vậy, việc biên dịch danh sách các gói yêu cầu khởi động lại (DBus không phải lúc nào cũng yêu cầu điều đó) thật ngu ngốc cho giải pháp hoàn chỉnh.
Olli

1
Bạn nói đúng ... Của tôi là một phần kiến ​​thức :(. Cảm ơn thông tin. Tôi đã không nhận ra các gói khác cũng yêu cầu khởi động lại
luri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.