kwb*_*kwb 10 server-crashes system-monitoring systemd rhel7
有没有办法确定RHEL7服务器是否通过systemctl(或reboot / shutdown别名)重新启动,或者服务器是否崩溃?Pre-systemd 这很容易用 确定last -x runlevel
,但用 RHEL7 就不太清楚了。
有趣的是,我昨晚碰巧重新启动了 CentOS 7 系统,所以我有一个很好的日志可供查看。
在崩溃的情况下,显然在崩溃和系统重新启动之间没有记录任何内容。
在重新启动的情况下,这很明显,因为您会获得 systemd 为关闭系统所做的(几乎)所有操作的日志。
除了关闭或进入单用户模式之外,您在任何情况下都不太可能看到这样的日志条目:
Jul 13 01:27:55 yaungol systemd: Stopped target Multi-User System.
Run Code Online (Sandbox Code Playgroud)
您可以重新启动自己的系统以查看实际记录的内容。
我不是特别喜欢这个答案,但这是我们从 RH 那里得到的答案。我把它贴在这里以防它帮助别人。
一种可能的方法是 grep for rsyslogd
in /var/log/messages
。正常关机将有exiting on signal 15
. 崩溃不会。
tac /var/log/messages | grep 'rsyslogd.*start\|rsyslogd.*exit'
两条连续的start
线可能表示崩溃。而一个start
接着一个exit
可能表明重新启动。
不幸的是,如果 rsyslogd 出现故障或在重启/崩溃之外重新启动,它也可能会产生不好的结果。
有不止一种方法可以做到这一点,但我将介绍我能想到的 4 个最好的方法。(编辑:我在 redhat.com 上发布了一个清理版本作为公共文章。请参阅:如何区分 RHEL 7 中的崩溃和正常重启。)
审计是惊人的。您可以通过检查查看它记录的所有不同事件ausearch -m
。对于手头的问题,它会记录系统关闭和系统启动,因此您可以使用命令ausearch -i -m system_boot,system_shutdown | tail -4
。如果报告SYSTEM_SHUTDOWN后跟SYSTEM_BOOT,则一切正常;但是,如果它连续报告 2 条SYSTEM_BOOT行,那么很明显系统没有正常关闭,如下例所示:
[root@a72 ~]# ausearch -i -m system_boot,system_shutdown | tail -4
----
type=SYSTEM_BOOT msg=audit(09/20/2016 01:10:32.392:7) : pid=657 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
----
type=SYSTEM_BOOT msg=audit(09/20/2016 01:11:41.134:7) : pid=656 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
Run Code Online (Sandbox Code Playgroud)
与上面相同,但使用简单的last -n2 -x shutdown reboot
命令。系统崩溃的示例:
[root@a72 ~]# last -n2 -x shutdown reboot
reboot system boot 3.10.0-327.el7.x Tue Sep 20 01:11 - 01:20 (00:08)
reboot system boot 3.10.0-327.el7.x Tue Sep 20 01:10 - 01:20 (00:09)
Run Code Online (Sandbox Code Playgroud)
或者系统正常重启的地方:
[root@a72 ~]# last -n2 -x shutdown reboot
reboot system boot 3.10.0-327.el7.x Tue Sep 20 01:21 - 01:21 (00:00)
shutdown system down 3.10.0-327.el7.x Tue Sep 20 01:21 - 01:21 (00:00)
Run Code Online (Sandbox Code Playgroud)
恕我直言,这是最好的方法,因为您可以根据需要对其进行定制。有一百万种方法可以做到这一点。这是我刚刚编的。下一个服务仅在关闭时运行。
[root@a72 ~]# cat /etc/systemd/system/set_gracefulshutdown.service
[Unit]
Description=Set flag for graceful shutdown
DefaultDependencies=no
RefuseManualStart=true
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=/bin/touch /root/graceful_shutdown
[Install]
WantedBy=shutdown.target
[root@a72 ~]# systemctl enable set_gracefulshutdown.service
Created symlink from /etc/systemd/system/shutdown.target.wants/set_gracefulshutdown.service to /etc/systemd/system/set_gracefulshutdown.service.
Run Code Online (Sandbox Code Playgroud)
然后当系统启动时,只有在上述关闭服务创建的文件存在时才会启动下一个服务。
[root@a72 ~]# cat /etc/systemd/system/check_graceful.service
[Unit]
Description=Check if system booted after a graceful shutdown
ConditionPathExists=/root/graceful_shutdown
RefuseManualStart=true
RefuseManualStop=true
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/rm /root/graceful_shutdown
[Install]
WantedBy=multi-user.target
[root@a72 ~]# systemctl enable check_graceful
Created symlink from /etc/systemd/system/multi-user.target.wants/check_graceful.service to /etc/systemd/system/check_graceful.service.
Run Code Online (Sandbox Code Playgroud)
因此,在任何给定时间,我都可以通过执行以下操作来检查上一次启动是否在正常关闭后完成systemctl is-active check_graceful
,例如:
[root@a72 ~]# systemctl is-active check_graceful && echo YAY || echo OH NOES
active
YAY
[root@a72 ~]# systemctl status check_graceful
? check_graceful.service - Check if system booted after a graceful shutdown
Loaded: loaded (/etc/systemd/system/check_graceful.service; enabled; vendor preset: disabled)
Active: active (exited) since Tue 2016-09-20 01:10:32 EDT; 20s ago
Process: 669 ExecStart=/bin/rm /root/graceful_shutdown (code=exited, status=0/SUCCESS)
Main PID: 669 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/check_graceful.service
Sep 20 01:10:32 a72.example.com systemd[1]: Starting Check if system booted after a graceful shutdown...
Sep 20 01:10:32 a72.example.com systemd[1]: Started Check if system booted after a graceful shutdown.
Run Code Online (Sandbox Code Playgroud)
或者这是在不正常关机之后:
[root@a72 ~]# systemctl is-active check_graceful && echo YAY || echo OH NOES
inactive
OH NOES
[root@a72 ~]# systemctl status check_graceful
? check_graceful.service - Check if system booted after a graceful shutdown
Loaded: loaded (/etc/systemd/system/check_graceful.service; enabled; vendor preset: disabled)
Active: inactive (dead)
Condition: start condition failed at Tue 2016-09-20 01:11:41 EDT; 16s ago
ConditionPathExists=/root/graceful_shutdown was not met
Sep 20 01:11:41 a72.example.com systemd[1]: Started Check if system booted after a graceful shutdown.
Run Code Online (Sandbox Code Playgroud)
值得一提的是,如果您配置systemd-journald
为保留一个持久日志,那么您可以使用journalctl -b -1 -n
查看上次引导的最后几行(默认为 10 行)(-b -2
是之前的引导等)。系统正常重启的示例:
[root@a72 ~]# mkdir /var/log/journal
[root@a72 ~]# systemctl -s SIGUSR1 kill systemd-journald
[root@a72 ~]# reboot
...
[root@a72 ~]# journalctl -b -1 -n
-- Logs begin at Tue 2016-09-20 01:01:15 EDT, end at Tue 2016-09-20 01:21:33 EDT. --
Sep 20 01:21:19 a72.example.com systemd[1]: Stopped Create Static Device Nodes in /dev.
Sep 20 01:21:19 a72.example.com systemd[1]: Stopping Create Static Device Nodes in /dev...
Sep 20 01:21:19 a72.example.com systemd[1]: Reached target Shutdown.
Sep 20 01:21:19 a72.example.com systemd[1]: Starting Shutdown.
Sep 20 01:21:19 a72.example.com systemd[1]: Reached target Final Step.
Sep 20 01:21:19 a72.example.com systemd[1]: Starting Final Step.
Sep 20 01:21:19 a72.example.com systemd[1]: Starting Reboot...
Sep 20 01:21:19 a72.example.com systemd[1]: Shutting down.
Sep 20 01:21:19 a72.example.com systemd-shutdown[1]: Sending SIGTERM to remaining processes...
Sep 20 01:21:19 a72.example.com systemd-journal[483]: Journal stopped
Run Code Online (Sandbox Code Playgroud)
如果您获得这样的良好输出,那么显然系统已正常关闭。也就是说,根据我的经验,当发生不好的事情(系统崩溃)时,它并不是非常可靠。有时索引变得很奇怪。
归档时间: |
|
查看次数: |
7272 次 |
最近记录: |