it-swarm.cn

如何从命令行判断机器是否需要重启?

当您在Ubuntu Desktop中安装某些更新(例如新内核)时,您会看到需要重新启动(在Lucid中,注销图标变为红色)。

如何从命令行检查Ubuntu 服务器是否需要重启?

我可以在/etc/motd中找到'需要重启系统',但我想要一个更优雅的解决方案。此外,我想要一个适用于旧版本的解决方案,例如哈迪(8.04 LTS)。

250
Marius Gedminas

您只需检查文件/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
283
Weboide

在包中,debian-goodies是一个名为checkrestart的命令,非常有用。它的输出可以帮助您避免完全重启。

它告诉您哪些正在运行的应用程序已加载在应用程序运行时已升级的共享库。然后,您手动重新启动应用程序和服务,避免完全重新启动。但是,对内核升级没有帮助。

44
aquaherd

通常如果是文件

/var/run/reboot-required 

存在你应该重启。您可以通过在gnome-terminal中使用此简单命令来查看此文件是否存在。

ls /var/run/reboot-required
33
kone4040

除了其他人编写的最直接的方法之外,还有一个方便的指示,如果你使用 byob - 一组脚本使GNU屏幕更加用户友好。它在屏幕底部显示一组信息,其中包括是否需要重新启动 - 以及是否有可用的更新,时间,正常运行时间,使用的内存......

在此屏幕截图中,您可以从底部的199!查看红色背景,其中有199个可用更新。 !!表示有些是安全更新 。前台菜单选择应显示哪些状态通知。

如果需要重新启动,则会在下方栏中显示符号(R),并在蓝色背景上显示白色文本。更多细节和其他指标可以在 byobu手册页 中阅读。

screenshot

17
Hamish Downer

/etc/motd文件获取有关是否需要从/var/run/reboot-required文件重新启动的信息。

您可以使用cat /etc/motd命令在终端中检查此文件的内容

9
ajmitch

我将以下内容添加到我的.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]:~$ 
7
Capricorn1

如果您安装了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

另一种选择是安装needrestart包。

Sudo apt-get install needrestart
Sudo needrestart -k

即使在内核升级后安装了needrestart,似乎也能工作。

7
Tim Bray

穷人的解决方案:

#!/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>]”。)

1
Enrique Perez-Terron