आप किसी दुर्घटना और RHEL7 पर रिबूट के बीच अंतर कैसे कर सकते हैं?


10

क्या यह निर्धारित करने का एक तरीका है कि क्या एक RHEL7 सर्वर को सिस्टमक्टेल (या रिबूट / शटडाउन अलायसेस) के माध्यम से रिबूट किया गया था, या क्या सर्वर क्रैश हो गया था? प्री- last -x runlevelसिस्टमड यह निर्धारित करना काफी आसान था , लेकिन आरएचईएल 7 के साथ यह इतना स्पष्ट नहीं है।

जवाबों:


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' 

(२) अंतिम -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)    

(३) अपनी स्वयं की सेवा इकाई बनाएँ

यह IMHO का सबसे अच्छा तरीका है क्योंकि आप इसे अपनी इच्छा के अनुरूप बना सकते हैं। ऐसा करने के लिए एक लाख तरीके हैं। यहाँ एक है जिसे मैंने अभी बनाया है। यह अगली सेवा केवल शटडाउन पर चलती है।

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

(४) जरनल

यह ध्यान देने योग्य है कि यदि आप 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 (और फेडोरा) लॉग में देखा था। जब हमने RHEL7 पर परीक्षण किया, तो कोई पासा नहीं।
kwb

1
@kwb आरएचईएल 7.2 प्रणाली पर एक नज़र डालने के बाद, हाँ, मुझे विश्वास है। वास्तव में, ऐसा प्रतीत होता है कि बहुत सी चीजें जिन्हें लॉग किया जाना चाहिए, उन्हें लॉग नहीं किया जा रहा है। मैं बस इतना ही कह सकता हूं: डब्ल्यूटीएफ?
माइकल हैम्पटन

यकीन नहीं होता कि आप लोग किस बारे में बात कर रहे हैं। RHEL 7.0-7.2 में systemd Stopping Multi-User Systemऔर Stopped target Multi-User Systemसंदेश उत्पन्न करता है ।
rsaw

@rsaw हम अच्छी तरह से जानते हैं कि संदेश उत्पन्न होते हैं। समस्या यह है कि वे पत्रिका में दिखाई नहीं दे रहे हैं।
माइकल हैम्पटन

@Michael Hampton पत्रिका डिफ़ॉल्ट रूप से स्थिर नहीं है। आप केवल अपने वर्तमान बूट से लॉग देख सकते हैं जब तक आप mkdir /var/log/journalया स्पष्ट रूप से सेट Storage=persistentमें /etc/systemd/journald.conf। मैंने एक अलग उत्तर पोस्ट किया।
rsaw

5

मुझे विशेष रूप से उत्तर पसंद नहीं है, लेकिन यह एक उत्तर है जो हमें आरएच से मिला है। मैं इसे यहाँ पोस्ट कर रहा हूँ अगर यह किसी और की मदद करे।

एक संभव तरीका के लिए grep rsyslogdहै /var/log/messages। एक सुंदर शटडाउन होगा exiting on signal 15। एक दुर्घटना नहीं होगी।

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

लगातार दो startलाइनें दुर्घटना का संकेत हो सकती हैं। और startइसके बाद exitरिबूट का संकेत हो सकता है।

दुर्भाग्य से यह खराब परिणाम भी दे सकता है अगर rsyslogd नीचे चला जाता है या रिबूट / क्रैश के बाहर फिर से शुरू होता है।


बैड प्ले रेड हैट। अन्य व्यवहार हैं जो 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.