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


256

在Ubuntu桌面上安装某些更新程序(例如新内核)时,您会看到需要重新启动的指示(在Lucid中,注销图标变为红色)。

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

我可以在中使用grep表示“需要系统重新启动” /etc/motd,但是我想要一个更优雅的解决方案。另外,我想要一个适用于较早版本的解决方案,例如Hardy(8.04 LTS)。


如果您要维护服务器,您很快就会发现是否更新需要重新启动。大多数更新不需要重启或仅重启服务(它应该自动重启)。
eXlin

Answers:


289

您可以简单地检查文件是否/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

1
这有效,并且对Hardy也有效。(在Dapper 6.06上无法使用,我仍然在一台机器上使用。很困难。)顺便说一句,/ var / run / reboot所需的文件是由/ usr / share / update-notifier / notify-reboot创建的-required,可从各种程序包的维护程序脚本中调用。
Marius Gedminas 2010年

2
如果我安装了update-notifier软件包,它也可以在Dapper上运行,只是它希望将价值120兆的GNOME东西拉入我的旧服务器中。
Marius Gedminas 2010年

10
最好安装update-notifier-common,它不依赖于任何GUI东西(但Dapper不存在)。
Marius Gedminas 2010年

1
FWIW,默认情况下,未在Lucid服务器上安装update-notifier-common。
Marius Gedminas 2010年

5
谢谢!该文件/var/run/reboot-required.pkgs将列出需要重启的软件包。
nealmcb 2015年

44

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

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


1
如何避免完全重启?
Oxwivi 2011年

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

这应该是最佳答案。很有帮助。OpenSUSE内置了一个工具(并且还可以帮助您如何运行它)。可耻的Ubuntu只是“重启,重启”。例如上色需要在这里重新启动。因此,无需重新启动。
Shiki 2013年

@aquaherd非常有用的评论-也许值得将其引入您的答案?
Duncan Jones

33

通常如果文件

/var/run/reboot-required 

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

ls /var/run/reboot-required

该文件似乎不再由用于创建该文件的update-notifier-common创建。
斯科特,

17

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

在此屏幕快照中,您可以从199!带有红色背景的底行上看到199个可用更新。一个!! 意味着一些是安全更新。前景中的菜单正在选择应显示哪些状态通知。

如果需要重新启动,则将由(R)下部栏中显示的符号表示,蓝色背景上带有白色文本。可以在byobu手册页中了解更多详细信息和其他指标。

屏幕截图


9

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

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


更新通知常见用于创建这一点,但没有了
斯科特

8

如果安装了重新启动通知程序或更新通知程序公共软件包,则将获得文件/ var / run / reboot-required和/var/run/reboot-required.pkgs

reboot-notifier在Ubuntu Wily和Xenial中较新。Debian舒展,但在杰西的支持中

update-notifier-common在所有Ubuntu版本(包括Xenial和Debian Wheezy)中都较旧。不在Debian Stretch或Jessie中。

https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/处的reboot-notifier程序包有一些背景知识 )

如果您没有安装这些软件包,则可以将Linux软件包的版本与运行的版本进行比较:

tim@tramp:~$ 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)
tim@tramp:~$ more /proc/version
Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (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,它似乎也能正常工作。


1
您的第一段与Ubuntu版本有何关系?
muru

好点子。谢谢。我花了很长时间测试并尝试了错过的那些软件包。我已进行编辑以使内容更清晰,并包含ubuntu软件包信息。
Bray)2016年

回到8.04,需要重新启动的更新之后,齿轮会变成红色。如何恢复该行为?
PenguinCSC '16

Ubuntu 14.04,我得到dpkg-query: no packages found matching linux-image-*
the_nuts 2016年

Unknown option: k在Ubuntu 14.04中。
Cees Timmerman

7

我在.bash-aliases文件中添加了以下内容:

alias rr='if [ -f /var/run/reboot-required ]; then echo "reboot required"; else echo "No reboot needed"; fi'

对于这个相对简单的任务,似乎比安装软件包要简单。然后我就运行:

you@somewhere:~$ rr
No reboot needed
you@somewhere:~$ 

1

穷人的解决方案:

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


grub 2不再使用/boot/grub/menu.lst,现在是/boot/grub/grub.cfg。
Marius Gedminas

-1

这不是问题的答案,而是有关以下几种回答的警告: /var/run/reboot-required不是是否确实需要重新启动的可靠来源。

简单测试:当新内核可用时,安装它,然后重新启动。重新引导后,运行apt autoremove以摆脱一些不再需要的旧内核。运行完之后,它将指出需要重新启动,这完全是废话。


3
好了,删除内核会重新生成您的grub配置文件,之后重新启动可能是一个好主意,以验证您仍然可以启动。至少这就是我为自己证明这个(错误)功能的方式。
Marius Gedminas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.