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

80

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

    
задан belacqua 01.03.2011 в 09:17
источник

4 ответа

79

Краткая версия:

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 .

Последний файл содержит список пакетов с запросом перезагрузки.

    
ответ дан Olli 01.03.2011 в 10:11
источник
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 .

Для получения дополнительной информации см. также этот поток .

    
ответ дан arrange 01.03.2011 в 10:10
2

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

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

Дождитесь завершения загрузки, в моей системе это было около 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

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

    
ответ дан Niklas Holm 10.02.2016 в 11:22
0

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

    
ответ дан luri 01.03.2011 в 09:42