检测Linux系统即将关机

13

由于我尽快安装待处理更新,我的Ubuntu服务器经常需要重新启动。我在该服务器上运行一个Web应用程序,并希望警告我的用户有待处理的重启。目前,我手动添加通知以在重启之前提醒他们有时间完成工作,然后重启并删除通知。

我希望shutdown -r +60会编写一个包含有关重启的所有信息的文件,我可以在每次访问时检查它。是否存在这样的文件?出于性能原因,希望是虚拟文件系统中的文件,例如/proc...

我正在运行Ubuntu 10.04.2 LTS。


你不需要一个虚拟文件系统“出于性能原因”。这是完全无效的理由。在Web应用程序中,在每个请求中从磁盘上读取真实文件并不是问题 - PHP Web应用程序通常在每个请求中读取数百个文件。 - MarkR
5个回答

32
如果您正在使用systemd,以下命令将显示计划的关机信息。
cat /run/systemd/shutdown/scheduled

输出示例:

USEC=1636410600000000
WARN_WALL=1
MODE=reboot

正如@Björn在评论中提到的,USEC是以微秒为单位的时间戳。

您可以通过删除最后6个数字并使用date将其转换为人类友好格式,例如:

$ date -d @1636410600
Mon Nov  8 23:30:00 CET 2021

我确认在Debian jessie、stretch和buster中运行systemd时,这个程序是有效的。 - anarcat
1
同样适用于focal。usec是以微秒为单位的时间戳。以防万一你在第一时间感到困惑,就像我一样 :-) - Björn

4
我能想到的最简单解决方案是编写一个脚本来包装关闭命令,并在该脚本中创建一个文件,您的Web应用程序可以检查该文件。
据我所知,关闭命令不会向底层文件系统写入文件,尽管它会触发广播消息来警告关闭,我想您可以编写一个程序来拦截...但上述解决方案似乎是最简单的。
脚本示例:
shutdown.bsh
touch /somefolder/somefile
shutdown -r $1

然后在您的 Web 应用程序中检查 'somefile'。

您需要添加一个启动链接来擦除 'somefile',否则当系统启动并且 Web 应用程序始终告诉用户它即将关闭时,该文件仍将存在。


4
您可以简单地检查正在运行的关机进程:
if ps -C shutdown > /dev/null; then
  echo "Shutdown is pending"
else
  echo "Shutdown is not scheduled"
fi

我想即使“关机”进程正在运行且未被计划,您也可以在“ps”输出中找到它...顺便说一句,我喜欢这个想法。 - Hastur
1
在现代系统(systemd?)上,可以安排无需等待关机进程的关机。 - Saustrup

1

据我所知,无论是在Debian jessie、stretch还是buster中,在重新启动时/run/systemd/shutdown/scheduled仍然存在。因此,我认为这是一种更好、更简单的方法。 - anarcat
@anarcat确实/run/systemd/shutdown/scheduled仍然存在。但是,当您取消关机时,/run/systemd/shutdown/scheduled仍将显示已计划的关机。 - akarapatis
听起来像是一个bug。 - anarcat

0

你可以编写一个守护进程,在捕获SIGINT / SIGQUIT信号时进行通告。


如果系统已经在关闭,这样的守护进程将被调用。但是shutdown命令允许我延迟关机,在这段时间里,我想警告我的用户。 - iGEL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接