当前位置: 首页>>技术问答>>正文


我如何知道哪些软件包需要重新启动系统?

,

问题描述

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

最佳解决方案

简洁版本:

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

后者文件包含请求重启的软件包列表。

次佳解决方案

unattended-upgrades发现存在/var/run/reboot-required时,建议重新启动。该文件由postinst(post-installation)脚本在一些包中创建,它看起来像这样:

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

如果你想看看哪些软件包触发了这个,你可以看看/var/run/reboot-required.pkgs文件的内容。

欲了解更多信息,请参阅this thread

第三种解决方案

根据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’之外的其他方式通知所需的重新启动,虽然这显示当前安装的软件包需要或不需要重新启动,但是对于同一软件包的更高版本,这并不一定适用。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/797.html,未经允许,请勿转载。