Es gibt mehr als einen Weg, dies zu tun, aber ich werde die 4 besten behandeln, die mir einfallen. (BEARBEITEN: Ich habe eine bereinigte Version davon als öffentlichen Artikel auf redhat.com veröffentlicht. Siehe: Unterscheiden zwischen einem Absturz und einem ordnungsgemäßen Neustart in RHEL 7. )
(1) geprüfte Protokolle
auditd ist unglaublich. Sie können alle verschiedenen Ereignisse anzeigen, die protokolliert werden, indem Sie überprüfen ausearch -m
. Entsprechend dem vorliegenden Problem werden das Herunterfahren des Systems und der Systemstart protokolliert, sodass Sie den Befehl verwenden können ausearch -i -m system_boot,system_shutdown | tail -4
. Wenn dies ein SYSTEM_SHUTDOWN gefolgt von einem SYSTEM_BOOT meldet , ist alles in Ordnung ; Wenn jedoch 2 SYSTEM_BOOT- Zeilen hintereinander gemeldet werden, wurde das System eindeutig nicht ordnungsgemäß heruntergefahren, wie im folgenden Beispiel:
[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) letztes -x
Wie oben, jedoch mit dem einfachen last -n2 -x shutdown reboot
Befehl. Beispiel, bei dem das System abgestürzt ist:
[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)
Oder wo das System einen ordnungsgemäßen Neustart hatte:
[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) Erstellen Sie Ihre eigene Serviceeinheit
Dies ist meiner Meinung nach der beste Ansatz, da Sie ihn auf alles zuschneiden können, was Sie wollen. Es gibt eine Million Möglichkeiten, dies zu tun. Hier ist eine, die ich gerade erfunden habe. Dieser nächste Dienst wird nur beim Herunterfahren ausgeführt.
[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.
Wenn das System dann startet, wird dieser nächste Dienst nur gestartet, wenn die vom obigen Abschaltdienst erstellte Datei vorhanden ist.
[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.
So kann ich jederzeit überprüfen, ob der vorherige Start nach einem ordnungsgemäßen Herunterfahren durchgeführt wurde, indem ich systemctl is-active check_graceful
z.
[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.
Oder hier ist nach einem unansehnlichen Herunterfahren:
[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
Es ist erwähnenswert, dass Sie, wenn Sie systemd-journald
ein dauerhaftes Journal führen, journalctl -b -1 -n
die letzten Zeilen (standardmäßig 10) des vorherigen Starts anzeigen können ( -b -2
ist der Start davor usw.). Beispiel, bei dem das System ordnungsgemäß neu gestartet wurde:
[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
Wenn Sie so eine gute Ausgabe erhalten, wurde das System eindeutig ordnungsgemäß heruntergefahren. Trotzdem ist es meiner Erfahrung nach nicht besonders zuverlässig, wenn schlimme Dinge passieren (Systemabstürze). Manchmal wird die Indizierung komisch.
Stopping Multi-User System
undStopped target Multi-User System
-Nachrichten.mkdir /var/log/journal
oder explizitStorage=persistent
in/etc/systemd/journald.conf
. Ich habe eine separate Antwort gepostet.Ich mag die Antwort nicht besonders, aber es ist eine Antwort, die wir von RH bekommen haben. Ich poste es hier, falls es jemand anderem hilft.
Ein möglicher Weg ist, nach
rsyslogd
in zu suchen/var/log/messages
. Ein würdevolles Herunterfahren hätteexiting on signal 15
. Ein Absturz würde nicht.tac /var/log/messages | grep 'rsyslogd.*start\|rsyslogd.*exit'
Zwei aufeinanderfolgende
start
Zeilen können auf einen Absturz hinweisen. Und einstart
gefolgt von einemexit
kann auf einen Neustart hinweisen.Leider kann es auch zu schlechten Ergebnissen kommen, wenn rsyslogd ausfällt oder außerhalb eines Neustarts / Absturzes neu gestartet wird.
quelle
exiting on signal 15
Neben einem Neustart gibt es noch andere Verhaltensweisen, die dazu führen . Ein Normalservice rsyslog restart
ergibt auch die Nachrichtexiting on signal 15
Nachricht.Dies scheint zu arbeiten konsequent für „Graceful Abschaltungen“ (
shutdown
,reboot
,systemctl
) sowie „abstürzt“ (Ausschalten, Resetecho c > /proc/sysrq-trigger
):last -x | grep 'reboot\|shutdown'
Eine
reboot
Zeile gefolgt von einershutdown
Zeile zeigt ein "ordnungsgemäßes Herunterfahren" an. Zweireboot
Zeilen zeigen einen "Absturz" an.quelle