我如何知道哪个包需要重新启动我的系统?

我如何知道哪个包需要重新启动我的系统?

我已经unattended-upgrade在 Ubuntu 系统上进行了设置。有时我会远程登录其中一个系统,然后会看到一条消息,通知我需要重新启动系统(以完成升级)。有没有办法确定触发此通知的特定软件包(或软件包集)?

答案1

简洁版本:

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

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文件的内容。

有关详细信息,另请参阅此主题

答案3

根据 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”之外的其他方式通知需要重启,虽然这会显示哪些当前安装的软件包需要或不需要重启,但不确定同一软件包的后续版本是否也如此。

答案4

我不知道是否有其他软件包需要重启,但内核更新总是需要重启。我几乎每次被“要求”重启时,内核都已经更新了。

相关内容