जब सिस्टम-मॉनिटर की गई सेवा विफल हो जाती है, तो अधिसूचना प्राप्त करें


32

मुझे नेटवर्क संदेश भेजने की आवश्यकता होती है जब एक सिस्टमड सेवा मेरे पास क्रैश होती है या लटका दी जाती है (यानी, विफल स्थिति में प्रवेश करती है; मैं वॉचडॉगसेक = का उपयोग करके त्रिशंकु की निगरानी करता हूं)। मैंने देखा कि नए systemd में FailureAction = है, लेकिन फिर देखा कि यह मनमाना आदेश नहीं देता है, लेकिन सिर्फ रिबूट या शटडाउन करता है।

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

मैं "लॉग को पार्स" से बेहतर उत्तर की उम्मीद कर रहा हूं, और मुझे कुछ ऐसा चाहिए, जिसके पास तुरंत प्रतिक्रिया का समय हो, इसलिए मुझे नहीं लगता कि मतदान का तरीका अच्छा है; यह होने वाली घटना से कुछ ट्रिगर होना चाहिए।


क्या आप कृपया एक उदाहरण (यहां तक ​​कि एक गैर काम कर रहे हैं) प्रदान कर सकते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं?
दाउद

क्या आप कृपया इस जानकारी को टिप्पणी में जोड़ने के बजाय अपने प्रश्न को संपादित करने के लिए संपादित कर सकते हैं? :)
दाऊद २

जवाबों:


31

systemd इकाइयाँ OnFailure का समर्थन करती हैं जो इकाई विफल होने पर एक इकाई (या अधिक) को सक्रिय करेगी। आप ऐसा कुछ डाल सकते हैं

 OnFailure=notify-failed@%n

और फिर वह notify-failed@.serviceसेवा बनाएं जहां आप आवश्यक विनिर्देशक का उपयोग कर सकते हैं (आप संभवतः कम से कम% i चाहते हैं) स्क्रिप्ट या कमांड को लॉन्च करेंगे जो अधिसूचना भेजेगा।

आप http://norministrlightlabs.se/systemd.status.mail.on.unit.failure में एक व्यावहारिक उदाहरण देख सकते हैं


5
लिंक किए गए साइट पर निर्देशों के लिए कुछ सुधार आवश्यक हैं। सबसे पहले, notify%n.serviceनिरर्थक है, और इसके परिणामस्वरूप होगा notify@my-service.service.service। दूसरा, के %iबजाय इस्तेमाल किया जाना चाहिए %I, या नाम में सभी डैश को आगे के स्लैश में बदल दिया जाएगा।
orodbhen

4
क्या उनकी इकाई फ़ाइलों को संशोधित किए बिना कई या सभी इकाइयों के लिए ऐसा करने का कोई तरीका है?
व्लादिमीर पेंटेलेव 12

16

बस मुझे सूचित करने का तरीका:

/etc/systemd/system/notify-email@.service

[Unit]
Description=Sent email 

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/systemctl status %i | /usr/bin/mailx -Ssendwait -s "[SYSTEMD_%i] Fail" your_admin@company.blablabla'

systemd में जोड़ें:

systemctl enable /etc/systemd/system/notify-email@service

अन्य सेवाओं में जोड़ें:

[Unit]
OnFailure=notify-email@%i.service

कॉन्फ़िगरेशन पुनः लोड करें:

systemctl daemon-reload

क्या एक पंक्ति में कई बार इसे ट्रिगर करने से बचने का एक तरीका है? कुछ स्थितियों में रात में विफल रही एक सेवा के बारे में 1K ईमेल प्राप्त करने और फिर से शुरू करने के लिए बार-बार प्रयास करने से मदद नहीं मिलती है।
starbeamrainbowlabs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.