web-dev-qa-db-ja.com

RHEL7でクラッシュとリブートをどのように区別できますか?

RHEL7サーバーがsystemctl(または再起動/シャットダウンエイリアス)経由で再起動されたかどうか、またはサーバーがクラッシュしたかどうかを確認する方法はありますか?これをシステム化する前に、これをlast -x runlevelですが、RHEL7ではそれほど明確ではありません。

9
kwb

これを行う方法は複数ありますが、考えられる4つの最良の方法を取り上げます。 (編集:これのクリーンアップされたバージョンをredhat.comの公開記事として公開しました。参照: RHEL 7でのクラッシュと正常な再起動を区別する方法 。)

(1)監査ログ

auditdは素晴らしいです。 ausearch -mをチェックすると、ログに記録されるさまざまなイベントをすべて表示できます。当面の問題に該当し、システムのシャットダウンとシステムの起動をログに記録するため、ausearch -i -m system_boot,system_shutdown | tail -4コマンドを使用できます。これがSYSTEM_SHUTDOWNの後にSYSTEM_BOOTが続く場合は、すべて正常です。ただし、2SYSTEM_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' 

(2)最後の-x

上記と同じですが、単純な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)    

または、システムが正常に再起動した場合:

[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)    

(3)独自のサービスユニットを作成する

あなたがそれをあなたが望むものに合わせることができるので、これは私見最良のアプローチです。これを行う方法は100万通りあります。これが今作ったものです。この次のサービスはシャットダウン時にのみ実行されます。

[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.

その後、システムが起動すると、この次のサービスは、上記のシャットダウンサービスによって作成されたファイルが存在する場合にのみ開始されます。

[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.

したがって、いつでも正常にシャットダウンした後に前回の起動が行われたかどうかを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.

または、ここは異常なシャットダウンの後です。

[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.

(4)journalctl

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

そのような良好な出力が得られれば、明らかにシステムは正常にシャットダウンされました。そうは言っても、悪いことが起こったとき(システムがクラッシュしたとき)は、私の経験ではそれほど信頼できません。インデックス作成が奇妙になることがあります。

3
rsaw

おかしい、私は昨夜たまたまCentOS 7システムを再起動したので、これだけの素敵なログを見ることができます。

クラッシュの場合、クラッシュの時刻とシステムの再起動の間に何も記録されないことは明らかです。

再起動の場合、systemdがシステムをシャットダウンするために実行している(ほぼ)すべてのログを取得するので、それはかなり明白です。

シャットダウンするか、シングルユーザーモードに移行する以外の状況では表示されない可能性が高いログエントリの1つは、次のとおりです。

Jul 13 01:27:55 yaungol systemd: Stopped target Multi-User System.

自分のシステムを再起動して、実際に何がログに記録されているかを確認できます。

7
Michael Hampton

私は特に答えは好きではありませんが、RHから得た答えです。他の誰かを助けるためにここに投稿します。

可能な方法の1つは、/var/log/messagesrsyslogdをgrepすることです。正常なシャットダウンにはexiting on signal 15が含まれます。クラッシュはしませんでした。

tac /var/log/messages | grep 'rsyslogd.*start\|rsyslogd.*exit'

2つの連続するstart行は、クラッシュを示す場合があります。また、startの後にexitが続く場合は、再起動を示している可能性があります。

残念ながら、rsyslogdがダウンしたり、リブート/クラッシュの外で再起動したりすると、悪い結果をもたらす可能性があります。

5
kwb

これは、「正常なシャットダウン」(shutdownrebootsystemctl)および「クラッシュ」(電源オフ、リセット、echo c > /proc/sysrq-trigger):

last -x | grep 'reboot\|shutdown'

reboot行とそれに続くshutdown行は、「正常なシャットダウン」を示します。 2つのreboot行は「クラッシュ」を示します。

1
kwb