Jak mogę stwierdzić, który pakiet wymaga ponownego uruchomienia mojego systemu?

85

Mam unattended-upgradeskonfigurować na moim systemie Ubuntu. Czasami loguję się zdalnie do jednego z nich i widzę komunikat informujący, że muszę zrestartować system (aby dokończyć aktualizację). Czy istnieje sposób na określenie konkretnego pakietu (lub zestawu pakietów), który uruchamia to powiadomienie?

Belacqua
źródło

Odpowiedzi:

80

Krótka wersja:

cat /var/run/reboot-required.pkgs

Wyjaśnienie:

Wygląda na to, że istnieje prosty sposób na automatyczne wyodrębnienie żądanych informacji.

Wewnątrz .debplików znajdują się pliki kontrolne do instalacji, w tym postinst(uruchamiane po instalacji).

Na przykład w linux-image-2.6.35-25-generic_2.6.35-25.44_amd64.deb,
postinstobejmuje

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

i

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

/usr/share/update-notifier/notify-reboot-requiredAktualizuje się skrypt powłoki
/var/run/reboot-required i /var/run/reboot-required.pkgs .

Ten ostatni plik zawiera listę pakietów żądających ponownego uruchomienia.

Olli
źródło
1
W moim systemie plik /var/run/reboot-requiredzostał utworzony dzień wcześniej, ale nie ma /var/run/reboot-required.pkgspliku @ Ubuntu 16.04.5 LTS.
Lion
25

Ponowne uruchomienie jest zalecane, unattended-upgradesgdy zobaczy, że /var/run/reboot-requiredistnieje. Plik jest tworzony przez postinstskrypty (poinstalacyjne) w niektórych pakietach, wygląda mniej więcej tak:

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

Jeśli chcesz zobaczyć, które pakiety to spowodowały, możesz zajrzeć do zawartości /var/run/reboot-required.pkgspliku.

Aby uzyskać więcej informacji, zobacz także ten wątek .

zorganizować
źródło
2

W oparciu o wcześniejszą odpowiedź Olli, wymyśliłem metodę znajdowania wszystkich aktualnie zainstalowanych pakietów w twoim systemie, która wymaga ponownego uruchomienia.

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

Poczekaj na zakończenie pobierania, w moim systemie było to około 900 MB, więc może to chwilę potrwać w zależności od połączenia. Następnie:

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

Dane wyjściowe mogą wyglądać mniej więcej tak:

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

Oczywiście ta metoda nie jest niezawodna. Mogą istnieć pakiety, które powiadamiają o wymaganym ponownym uruchomieniu komputera za pomocą innych środków niż „powiadomienie-wymagane ponowne uruchomienie”, i chociaż pokazuje to, które obecnie zainstalowane pakiety wymagają ponownego uruchomienia lub nie, nie jest pewne, czy to samo zachowa się na później wersje tego samego pakietu.

Niklas Holm
źródło
3
Możesz to zrobić bez żmudnego pobierania za pomocą just grep -l reboot-required /var/lib/dpkg/info/*.postinst | sed -e 's,^.*/\(.*\)\.postinst,\1,'. Należy jednak pamiętać, że będzie to zgłosić tylko pakiety, które może wymagać ponownego uruchomienia komputera w pewnym momencie, a nie pakiet, który nie wymaga restarcie ten czas
Matija Nalis
0

Naprawdę nie wiem, czy istnieją inne pakiety wymagające ponownego uruchomienia, ale aktualizacje jądra zawsze tak robią. Powiedziałbym, że prawie za każdym razem, gdy „proszono mnie” o ponowne uruchomienie, jądro było aktualizowane.

luri
źródło
1
Moim zdaniem to nie wystarczy. Aktualizacje bootloadera wymagają również ponownego uruchomienia, a także init (upstart).
Olli
1
Cóż, także niektóre inne pakiety, takie jak DBus: ubuntu.com/usn/USN-799-1 . Dlatego skompilowanie listy pakietów wymagających ponownego uruchomienia (DBus nie zawsze tego wymaga) jest głupotą dla kompletnego rozwiązania.
Olli
1
Masz rację ... Moja wiedza jest częściowa :(. Dzięki za informację. Nie zdawałem sobie sprawy, że inne pakiety też wymagają restartu.
luri