当您在Ubuntu Desktop中安装某些更新(例如新内核)时,您会看到需要重新启动(在Lucid中,注销图标变为红色)。
如何从命令行检查Ubuntu 服务器是否需要重启?
我可以在/etc/motd
中找到'需要重启系统',但我想要一个更优雅的解决方案。此外,我想要一个适用于旧版本的解决方案,例如哈迪(8.04 LTS)。
您只需检查文件/var/run/reboot-required
是否存在即可。
例如,如果您不需要重新启动,其中任何一个都会告诉您“没有这样的文件”或“找不到文件”,否则(如果您需要重新启动)文件将存在,这些命令将显示有关该文件的信息:
file /var/run/reboot-required
stat /var/run/reboot-required
ls /var/run/reboot-required
在bash脚本中,您可以使用:
#!/bin/bash
if [ -f /var/run/reboot-required ]; then
echo 'reboot required'
fi
在包中,debian-goodies是一个名为checkrestart
的命令,非常有用。它的输出可以帮助您避免完全重启。
它告诉您哪些正在运行的应用程序已加载在应用程序运行时已升级的共享库。然后,您手动重新启动应用程序和服务,避免完全重新启动。但是,对内核升级没有帮助。
通常如果是文件
/var/run/reboot-required
存在你应该重启。您可以通过在gnome-terminal中使用此简单命令来查看此文件是否存在。
ls /var/run/reboot-required
/etc/motd
文件获取有关是否需要从/var/run/reboot-required
文件重新启动的信息。
您可以使用cat /etc/motd
命令在终端中检查此文件的内容
我将以下内容添加到我的.bash-aliases文件中:
alias rr='if [ -f /var/run/reboot-required ]; then echo "reboot required"; else echo "No reboot needed"; fi'
看起来比为这个相对简单的任务安装包更简单。然后我跑了:
[email protected]:~$ rr
No reboot needed
[email protected]:~$
如果您安装了reboot-notifier或update-notifier-common软件包,那么您将获得文件/ var/run/reboot-required和/var/run/reboot-required.pkgs
reboot-notifier在Ubuntu Wily和Xenial中更新。 Debian伸展,但在jessie-backports
update-notifier-common在所有Ubuntu版本中都比较旧,包括Xenial和Debian Wheezy。不是在Debian Stretch或Jessie。
(在 https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/ 上有一些reboot-notifier包的背景知识。
如果您没有安装这些软件包,那么您可以将安装的Linux软件包的版本与运行的版本进行比较:
[email protected]:~$ dpkg -l linux-image-*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-=================================-=====================-=====================-=======================================================================
ii linux-image-3.16.0-4-AMD64 3.16.7-ckt20-1+deb8u4 AMD64 Linux 3.16 for 64-bit PCs
ii linux-image-AMD64 3.16+63 AMD64 Linux for 64-bit PCs (meta-package)
[email protected]:~$ more /proc/version
Linux version 3.16.0-4-AMD64 ([email protected]) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian <b>3.16.7-ckt20-1+deb8u3</b> (2016-01-17)
你可以在这里看到最新安装的内核是3.16.7-ckt20-1 + deb8u4,但运行的内核是3.16.7-ckt20-1 + deb8u3。所以这个系统需要重启。 u4 vs u3在最后。
您可能需要滚动上面的框。在/ proc/version中,它是接近行尾的版本。
非常小的版本代码更改是Debian安全内核更新的典型代码。
另一种选择是安装needrestart
包。
Sudo apt-get install needrestart
Sudo needrestart -k
即使在内核升级后安装了needrestart,似乎也能工作。
穷人的解决方案:
#!/bin/bash
default=$(sed -n 's/^default[ ]*\([0-9][0-9]*\).*/\1/p' /boot/grub/menu.lst | tail -1)
if [ "$default" = "" ]; then default=0; fi
want=$(sed -n 's/^kernel[ ]*\/boot\/vmlinuz-\([^ ]*\).*/\1/p' /boot/grub/menu.lst | sed -n "$((default+1))p")
running=$(uname -r)
if [ "$running" = "$want" ]
then
: OK, do nothing
else
echo "Running $running, want $want. Reboot required."
fi
(注意:内部带有空格的三个方括号应为“[<space> <tab>]”。)