Answers:
简洁版本:
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
(安装后)脚本在某些程序包中创建的,看起来像这样:
[ -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”以外的其他方式通知需要的重新启动,虽然这显示了当前安装的软件包需要或不需要重新启动,但不确定以后是否同样适用相同软件包的版本。
grep -l reboot-required /var/lib/dpkg/info/*.postinst | sed -e 's,^.*/\(.*\)\.postinst,\1,'
。但是请注意,这将只报告了哪些软件包可能在一段时间后需要重启,不是该包确实需要重启这个时候
/var/run/reboot-required
是在前一天创建的,但是没有/var/run/reboot-required.pkgs
文件@ Ubuntu 16.04.5 LTS。