如何判断哪个软件包需要重新启动系统?

我在我的Ubuntu系统上设置了unattended-upgrade。偶尔我会远程登录其中一个系统,然后看到一条消息告诉我需要重新启动系统(以完成升级)。有没有办法确定是哪个特定的软件包(或一组软件包)触发了这个通知?
4个回答

简短版本:
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);
}

这个shell脚本 /usr/share/update-notifier/notify-reboot-required 会更新 /var/run/reboot-required/var/run/reboot-required.pkgs
后者文件包含了请求重新启动的软件包列表。

2在我的系统上,文件/var/run/reboot-required是在一天之前创建的,但在Ubuntu 16.04.5 LTS中没有/var/run/reboot-required.pkgs文件。 - Lion

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 文件的内容。
更多信息请参考此帖子

根据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

当然,这种方法并不是百分之百可靠的。可能会有一些软件包通过与“notify-reboot-required”不同的方式通知需要重新启动,而且虽然该方法可以显示当前安装的软件包是否需要重新启动,但不能确定对于同一个软件包的以后版本是否仍然适用。

5你可以通过只使用 grep -l reboot-required /var/lib/dpkg/info/*.postinst | sed -e 's,^.*/\(.*\)\.postinst,\1,' 完成相同的操作,而无需进行任何繁琐的下载。但请注意,它仅会报告可能在某个时候需要重新启动的软件包,而不是此次实际上需要重新启动的软件包。 - Matija Nalis

我不太清楚是否还有其他需要重新启动的软件包,但内核更新总是需要的。我可以说几乎每次被“要求”重新启动时,都是因为内核已经更新了。

1在我看来,这还不够好。引导加载程序更新也需要重新启动,以及init(upstart)。 - Olli
1嗯,还有一些其他的软件包,比如DBus:http://www.ubuntu.com/usn/USN-799-1。因此,编译一个需要重新启动的软件包列表(DBus并不总是需要重新启动)对于完整的解决方案来说是愚蠢的。 - Olli
1你说得对...我的知识只是一部分而已 :(. 谢谢你提供的信息。我之前没有意识到其他软件包也需要重新启动。 - luri