Як можна відрізнити збій і перезавантаження на RHEL7?


10

Чи є спосіб визначити, чи був перезавантажений сервер RHEL7 через systemctl (або псевдоніми перезавантаження / вимкнення), чи сервер зазнав аварії? Попередньо систематизовано це було досить легко визначити last -x runlevel, але з RHEL7 це не так однозначно.

Відповіді:


4

Існує більше ніж один спосіб зробити це, але я висвітлю 4 найкращих, про які я можу придумати. (EDIT: Я опублікував очищену версію цього як публічну статтю на redhat.com. Див.: Як розрізнити аварію та витончене перезавантаження в RHEL 7. )

(1) журнали аудиту

аудит дивовижний. Ви можете побачити всі різні події, які він реєструє, перевіривши 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' 

(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) створити власний блок обслуговування

Це найкращий підхід ІМХО, оскільки ви можете налаштувати його на все, що завгодно. Є мільйон способів зробити це. Ось я тільки що склав. Наступна послуга працює лише при відключенні.

[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) журнал

Варто згадати, що якщо ви налаштовуєте 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

Якщо ви отримаєте хороший вихід таким чином, тоді явно система була вимкнено витончено. Однак, на мій досвід, це не дуже надійно, коли трапляються погані речі (збої в системі). Іноді індексація стає дивною.


8

Смішно, я щойно трапився перезавантажити систему CentOS 7 минулої ночі, і тому я маю приємний журнал лише цього.

У випадку аварії, очевидно, нічого не реєструється між часом аварії та перезавантаженням системи.

У випадку перезавантаження це досить очевидно, оскільки ви отримуєте журнал (майже) всього, що система робить, щоб вимкнути систему.

Один з таких записів журналу, який ви, швидше за все, не побачите за будь-яких обставин, окрім вимкнення або переходу в режим одного користувача:

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

Ви можете перезавантажити власну систему, щоб побачити, що насправді реєструється.


1
Чи повірите ви, що CentOS 7 це записує, а RHEL 7 - ні? Це був наш початковий підхід, заснований на тому, що ми бачили в журналах CentOS (та Fedora). Коли ми тестували на RHEL7, без кісток.
— kwb

1
@kwb Переглянувши систему RHEL 7.2, так, я вважаю. Насправді, схоже, багато речей, які слід записати, не реєструються. Я можу сказати на це лише: WTF?
— Майкл Хемптон

Не впевнені, про що ви говорите. Система в RHEL 7.0-7.2 генерує Stopping Multi-User Systemі Stopped target Multi-User Systemповідомлення.
— rsaw

@rsaw Ми добре знаємо, що повідомлення створюються. Проблема полягає в тому, що вони не з’являються в журналі.
— Майкл Хемптон

@MichaelHampton журнал за замовчуванням не підтримується. Ви можете бачити журнали лише з вашого поточного завантаження, якщо ви не вказали mkdir /var/log/journalабо явно не ввійшли Storage=persistentв нього /etc/systemd/journald.conf. Я розмістив окрему відповідь.
— rsaw

5

Я не особливо люблю відповідь, але це відповідь, яку ми отримали від RH. Я розміщую його тут на випадок, якщо це допомагає комусь іншому.

Одним з можливих способів є виокремити інформацію rsyslogdв /var/log/messages. Витончене відключення було б exiting on signal 15. Аварії не буде.

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

Два послідовні startлінії можуть вказувати на збій. А startподальше повідомлення exitможе вказувати на перезавантаження.

На жаль, це також може дати погані результати, якщо rsyslogd знизиться або перезапуститься поза перезавантаженням / збоєм.


Погана гра Red Hat. Є й інші способи поведінки, які призведуть до того ж, exiting on signal 15крім перезавантаження. Нормальне service rsyslog restartтакож призводить до повідомлення exiting on signal 15повідомлення.
— Стефан Ласєвський

Це правдива відповідь, але як хтось, хто працює в технічній підтримці Red Hat, я б не з цим пішов. Дивіться мою відповідь.
— rsaw

1

Це схоже на роботу послідовно для «витончених зупинок» ( shutdown, reboot, systemctl), а також «аварія» (відключення живлення, скидання, echo c > /proc/sysrq-trigger):

last -x | grep 'reboot\|shutdown'

rebootЛінії слід shutdownлінії вказує на «завершення» витончений. Два rebootрядки вказують на "збій".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.