有没有办法确定 RHEL7 服务器是否通过 systemctl(或 reboot / shutdown 别名)重新启动,或者服务器是否崩溃?Pre-systemd 使用 很容易确定last -x runlevel
,但使用 RHEL7 就不太清楚了。
有没有办法确定 RHEL7 服务器是否通过 systemctl(或 reboot / shutdown 别名)重新启动,或者服务器是否崩溃?Pre-systemd 使用 很容易确定last -x runlevel
,但使用 RHEL7 就不太清楚了。
有趣的是,我昨晚碰巧重新启动了一个 CentOS 7 系统,所以我有一个很好的日志可以查看。
在崩溃的情况下,显然在崩溃和系统重新启动之间没有任何记录。
在重新启动的情况下,这很明显,因为您会获得(几乎)systemd 为关闭系统所做的所有事情的日志。
除了关闭或进入单用户模式之外,您在任何情况下都不太可能看到的此类日志条目是:
您可以重新启动自己的系统以查看实际记录的内容。
有不止一种方法可以做到这一点,但我会介绍我能想到的 4 种最好的方法。(编辑:我在 redhat.com 上作为公开文章发布了此版本的清理版本。请参阅:如何区分 RHEL 7 中的崩溃和正常重启。)
(1) 审核日志
审计是惊人的。您可以通过检查来查看它记录的所有不同事件
ausearch -m
。针对手头的问题,它会记录系统关闭和系统启动,因此您可以使用命令ausearch -i -m system_boot,system_shutdown | tail -4
。如果这报告一个SYSTEM_SHUTDOWN后跟一个SYSTEM_BOOT,那么一切都很好;但是,如果它连续报告 2条 SYSTEM_BOOT行,那么显然系统没有正常关闭,如下例所示:(2) 最后-x
与上面相同,但使用简单的
last -n2 -x shutdown reboot
命令。系统崩溃的例子:或者系统正常重启的地方:
(3) 创建自己的服务单元
恕我直言,这是最好的方法,因为您可以根据需要对其进行调整。有一百万种方法可以做到这一点。这是我刚编的一个。下一个服务仅在关机时运行。
那么当系统启动时,只有在上面的shutdown服务创建的文件存在的情况下,这个next服务才会启动。
因此,在任何给定时间,我都可以通过执行来检查上一次启动是否在正常关机后完成
systemctl is-active check_graceful
,例如:或者这是在不正常关机之后:
(4) journalctl
值得一提的是,如果您配置
systemd-journald
为保留持久日志,则可以使用journalctl -b -1 -n
查看上次引导的最后几行(默认为 10 行)(-b -2
是之前的引导等)。系统正常重启的示例:如果你得到这样的良好输出,那么显然系统已正常关闭。也就是说,根据我的经验,当坏事发生(系统崩溃)时,它并不是超级可靠的。有时索引会变得很奇怪。
我不是特别喜欢这个答案,但这是我们从 RH 得到的答案。我把它贴在这里以防它帮助别人。
一种可能的方法是 grep for
rsyslogd
in/var/log/messages
。优雅的关机将有exiting on signal 15
. 崩溃不会。tac /var/log/messages | grep 'rsyslogd.*start\|rsyslogd.*exit'
两条连续
start
的线可能表示崩溃。astart
后跟 anexit
可能表示重新启动。不幸的是,如果 rsyslogd 出现故障或在重新启动/崩溃之外重新启动,它也可能会产生不好的结果。
这似乎对“正常关机”(
shutdown
,reboot
,systemctl
)以及“崩溃”(关机、重置、echo c > /proc/sysrq-trigger
)始终有效:last -x | grep 'reboot\|shutdown'
一行
reboot
后跟shutdown
一行表示“正常关闭”。两reboot
行表示“崩溃”。