जब जीएनयू 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 )
:है? यह मुझे समझ में आता है कि यह एक अर्धविराम था;...