GNU grep
sonucunu 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, if
ifadenin her zaman else
dalı 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 grep
dize echo
içiniz, ancak her iki çıktı akışını grep
da hiçbir yere yazamamak için kapatıyoruz . Gördüğünüz gibi, GNU'nun çıkış durumu grep
0 yerine 2'dir.
Bu GNU özgü olan grep
, grep
aynı 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 grep
için -q
seç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 10m
veya başka bir şeyle değiştirebilirsiniz .
Ben de pek mantıklı değil ping
gibi 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ı;
...