GNU grepsonucunu yazmaya çalıştığında, sıfır olmayan bir çıkış durumuyla başarısız olur, çünkü SSH bağlantısı gittiği için çıktı yazacak hiçbir yeri yoktur.
Bu, ififadenin her zaman elsedalı ele aldığı anlamına gelir .
Bunu göstermek için (bu tam olarak sizin durumunuzda olan şey değildir , ancak GNU grepçıktısını yazamazsa ne olacağını gösterir ):
$ echo 'hello' | grep hello >&- 2>&-
$ echo $?
2
Burada üreten grepdize echoiçiniz, ancak her iki çıktı akışını grepda hiçbir yere yazamamak için kapatıyoruz . Gördüğünüz gibi, GNU'nun çıkış durumu grep0 yerine 2'dir.
Bu GNU özgü olan grep, grepaynı uslu durmuyor BSD sistemlerde:
$ echo 'hello' | grep hello >&- 2>&- # using BSD grep here
$ echo $?
0
Bunu düzeltmek için komut dosyasının çıktı oluşturmadığından emin olun. Bunu ile yapabilirsiniz exec >/dev/null 2>&1. Ayrıca, ondan çıktıyı görmekle hiç ilgilenmediğimiz grepiçin -qseçeneğiyle birlikte kullanmalıyız (bu genellikle tüm dosyayı ayrıştırması gerekmediği için hızlanır , ancak bu durumda çok az dosyadaki çok küçük olduğundan hızdaki fark).grep
Kısacası:
#!/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
Ayrıca ping, ara dosyalardan birine olan ihtiyacı ortadan kaldırarak (ve gerçekten yalnızca bir tarih damgası içeren diğer ara dosyadan kurtularak) doğrudan bir test de kullanabilirsiniz :
#!/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
Yukarıdaki komut dosyasının her iki varyasyonunda, yalnızca gönderilen e-posta sayısını en aza indirmek için ana bilgisayara ulaşılamadığında döngüden çıkmayı seçiyorum. Sunucunun sonunda tekrar ortaya çıkmasını bekliyorsanız bunun yerine breakörneğin sleep 10mveya başka bir şeyle değiştirebilirsiniz .
Ben de pek mantıklı değil pinggibi kullanılan seçenekleri biraz tweaked .-i 1-c 1
Daha kısa (ana bilgisayara erişilemediğinde e-posta göndermeye devam etmesini istemiyorsanız):
#!/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
Her dakika çalışan bir cron işi olarak (sunucu kapanmaya devam ederse her dakika e-posta göndermeye devam eder):
* * * * * ping -q -c 1 -W 1 >/dev/null 2>&1 || ( date | mail -s "Server down" myemail@address.com )
:? Noktalı virgül olması bana mantıklı;...