如何判断哪个包需要重启我的系统?
我在我的Ubuntu系统上进行了unattended-upgrade
设置。 偶尔我会远程登录其中一个,我会看到一条消息,通知我需要重启系统(为了完成升级)。 有没有办法确定触发此通知的特定包(或包组)?
精简版:
cat /var/run/reboot-required.pkgs
说明:
看起来有一种简单的方法可以自动提取所请求的信息。
在.deb
文件中有安装的控制文件,包括postinst
(安装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
时,建议/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”之外的其他方式通知所需的重新启动,虽然这显示了当前安装的软件包需要或不需要重新启动,但不确定是否同样适用于以后同一个包的版本。
我真的不知道是否有其他软件包需要重新启动,但内核更新总是如此。 我几乎每次“被要求”重启时都会说,内核已经更新了。