Как я могу узнать, какой пакет требует перезагрузки моей системы?

85

Я unattended-upgradeустановил в своих системах Ubuntu. Время от времени я удаленно захожу на один из них и вижу сообщение, информирующее меня о том, что мне нужно перезагрузить систему (чтобы завершить обновление). Есть ли способ определить конкретный пакет (или набор пакетов), который вызывает это уведомление?

belacqua
источник

Ответы:

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 нет.
Лев
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

Основываясь на предыдущем ответе Олли, я нашел способ найти все установленные на данный момент пакеты в вашей системе, которые требуют перезагрузки.

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

Подождите, пока загрузка завершится, в моей системе это было около 900 МБ, поэтому это может занять некоторое время в зависимости от вашего соединения. Затем:

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

Конечно, этот метод не является надежным. Могут быть пакеты, которые уведомляют о требуемой перезагрузке с помощью других средств, кроме «notify-reboot-required», и хотя это показывает, какие в настоящее время установленные пакеты требуют или не требуют перезагрузки, она не уверена, что то же самое сохранится для последующих версии того же пакета.

Никлас Холм
источник
3
Вы можете сделать то же самое без какой-либо утомительной загрузки с помощью Just grep -l reboot-required /var/lib/dpkg/info/*.postinst | sed -e 's,^.*/\(.*\)\.postinst,\1,'. Однако следует отметить , что это будет только сообщить , какие пакеты может потребоваться перезагрузка на некоторое время, а не какой пакет сделал с перезагрузкой на этот раз
Матия Nalis
0

Я действительно не знаю, есть ли другие пакеты, которые требуют перезагрузки, но обновления ядра всегда делают. Я бы сказал, что почти каждый раз, когда меня «просили» перезагрузиться, ядро ​​обновлялось.

Лури
источник
1
На мой взгляд, этого недостаточно. Обновления загрузчика также запрашивают перезагрузку, а также init (upstart).
Олли
1
Ну, а также некоторые другие пакеты, такие как DBus: ubuntu.com/usn/USN-799-1 . Поэтому составление списка пакетов, требующих перезапуска (DBus не всегда этого требует), является глупым для полного решения.
Олли
1
Ты прав ... Мое частичное знание :(. Спасибо за информацию. Я не понял, что другие пакеты тоже требуют перезапуска.
luri