जब जीएनयू grep
अपना परिणाम लिखने की कोशिश करता है, तो यह एक गैर-शून्य निकास स्थिति के साथ विफल हो जाएगा, क्योंकि इसमें आउटपुट लिखने के लिए कहीं नहीं है, क्योंकि एसएसएच कनेक्शन चला गया है।
इसका मतलब है कि if
बयान हमेशा else
शाखा ले रहा है ।
इसे स्पष्ट करने के लिए ( आपके मामले में वास्तव में ऐसा नहीं है , लेकिन यह दिखाता है कि क्या होता है अगर GNU grep
अपना आउटपुट लिखने में असमर्थ है):
$ echo 'hello' | grep hello >&- 2>&-
$ echo $?
2
यहां हम grep
उस स्ट्रिंग के लिए हैं जो echo
उत्पादन करता है, लेकिन हम दोनों आउटपुट स्ट्रीम को बंद कर देते हैं grep
ताकि यह कहीं भी न लिख सके। जैसा कि आप देख सकते हैं, GNU grep
का निकास स्थिति 0 के बजाय 2 है।
यह विशेष रूप से जीएनयू के लिए है grep
, grep
बीएसडी सिस्टम पर समान व्यवहार नहीं होगा:
$ echo 'hello' | grep hello >&- 2>&- # using BSD grep here
$ echo $?
0
इसे मापने के लिए, सुनिश्चित करें कि स्क्रिप्ट आउटपुट उत्पन्न नहीं करती है। आप इसके साथ कर सकते हैं exec >/dev/null 2>&1
। इसके अलावा, हमें grep
इसके -q
विकल्प का उपयोग करना चाहिए क्योंकि हम इसमें से आउटपुट को देखने के इच्छुक नहीं हैं (यह आम तौर पर गति भी बढ़ाएगा grep
क्योंकि इसे पूरी फ़ाइल को पार्स करने की आवश्यकता नहीं है, लेकिन इस मामले में यह बहुत कम है गति में अंतर चूंकि फ़ाइल इतनी छोटी है)।
संक्षेप में:
#!/bin/sh
# redirect all output not redirected elsewhere to /dev/null by default:
exec >/dev/null 2>&1
while true; do
date >sdown.txt
ping -c 1 -W 1 myserver.net >pingop.txt
if ! grep -q "64 bytes" pingop.txt; then
mutt -s "Server Down!" myemail@address.com <sdown.txt
break
fi
sleep 10
done
आप ping
इंटरमीडिएट फ़ाइलों में से किसी एक की आवश्यकता को हटाते हुए (और वास्तव में कभी केवल एक डेटास्टैम्प शामिल कर सकते हैं) भी सीधे परीक्षण पर उपयोग कर सकते हैं :
#!/bin/sh
exec >/dev/null 2>&1
while true; do
if ! ping -q -c 1 -W 1 myserver.net; then
date | mutt -s "Server Down!" myemail@address.com
break
fi
sleep 10
done
उपरोक्त स्क्रिप्ट के दोनों रूपों में, मैं होस्ट तक पहुंचने में विफलता पर पाश से बाहर निकलने का चयन करता हूं, बस भेजे गए ईमेल की संख्या को कम करने के लिए। यदि आप सर्वर से अंततः फिर से आने की अपेक्षा करते हैं, तो आप इसके बजाय break
उदाहरण के लिए sleep 10m
या कुछ और के साथ बदल सकते हैं ।
मैं भी थोड़ा के साथ इस्तेमाल किया विकल्प के ping
रूप में -i 1
ज्यादा मतलब नहीं है के साथ tweaked है -c 1
।
शॉर्टर (जब तक आप यह नहीं चाहते कि मेजबान के अप्राप्य होने पर ईमेल भेजना जारी रहे):
#!/bin/sh
exec >/dev/null 2>&1
while ping -q -c 1 -W 1 myserver.net; do
sleep 10
done
date | mutt -s "Server Down!" myemail@address.com
क्रोन जॉब के रूप में हर मिनट चल रहा है (यदि सर्वर डाउन रहता है तो हर मिनट ईमेल भेजना जारी रहेगा):
* * * * * ping -q -c 1 -W 1 >/dev/null 2>&1 || ( date | mail -s "Server down" myemail@address.com )
:
है? यह मुझे समझ में आता है कि यह एक अर्धविराम था;
...