Mencoba di sini untuk menulis skrip shell yang terus menguji server saya dan mengirim email kepada saya ketika sudah down.
Masalahnya adalah ketika saya logout dari koneksi ssh, meskipun menjalankannya dengan &
di akhir perintah, seperti ./stest01.sh &
, secara otomatis jatuh ke yang lain dan terus mengirimi saya tanpa gangguan, sampai saya login lagi dan membunuhnya.
#!/bin/bash
while true; do
date > sdown.txt ;
cp /dev/null pingop.txt ;
ping -i 1 -c 1 -W 1 myserver.net > pingop.txt &
sleep 1 ;
if
grep "64 bytes" pingop.txt ;
then
:
else
mutt -s "Server Down!" myemail@address.com < sdown.txt ;
sleep 10 ;
fi
done
linux
shell-script
grep
ping
Vasconcelos1914
sumber
sumber
:
? Akan masuk akal bagi saya itu adalah titik koma;
...:
melakukan apa-apa. Inilah yang dirancang untuk dilakukan. Di sini, alih-alih membalik tes, mereka menggunakannya untuk melakukan no-op sebelumnyaelse
.Jawaban:
Ketika GNU
grep
mencoba untuk menulis hasilnya, ia akan gagal dengan status keluar yang tidak nol, karena ia tidak punya tempat untuk menulis output, karena koneksi SSH hilang.Ini berarti bahwa
if
pernyataan itu selalu mengambilelse
cabang.Untuk menggambarkan hal ini (ini bukan persis apa yang terjadi dalam kasus Anda, tapi itu menunjukkan apa yang terjadi jika GNU
grep
tidak dapat menulis output):Di sini kita
grep
mencari string yangecho
menghasilkan, tetapi kita menutup kedua aliran keluarangrep
agar tidak dapat menulis di mana pun. Seperti yang Anda lihat, status keluar dari GNUgrep
adalah 2 daripada 0.Ini khusus untuk GNU
grep
,grep
pada sistem BSD tidak akan berlaku sama:Untuk memperbaiki ini, pastikan skrip tidak menghasilkan output. Anda dapat melakukannya dengan
exec >/dev/null 2>&1
. Juga, kita harus menggunakangrep
dengan-q
opsi ini karena kita sama sekali tidak tertarik melihat output dari itu (ini umumnya juga akan mempercepatgrep
karena tidak perlu menguraikan seluruh file, tetapi dalam hal ini membuat sangat sedikit perbedaan kecepatan karena file sangat kecil).Pendeknya:
Anda juga dapat menggunakan tes
ping
langsung, menghapus kebutuhan untuk salah satu file perantara (dan juga menyingkirkan file perantara lainnya yang benar-benar hanya berisi datestamp):Dalam kedua variasi skrip di atas, saya memilih untuk keluar dari loop setelah gagal mencapai host, hanya untuk meminimalkan jumlah email yang dikirim. Anda bisa mengganti
break
dengan egsleep 10m
atau sesuatu jika Anda mengharapkan server akhirnya muncul lagi.Saya juga sedikit mengubah opsi yang digunakan
ping
sebagai-i 1
tidak masuk akal-c 1
.Lebih pendek (kecuali jika Anda ingin terus mengirim email ketika tuan rumah tidak terjangkau):
Sebagai pekerjaan cron yang berjalan setiap menit (akan terus mengirim email setiap menit jika server terus turun):
sumber
>&-
akan menutup fd (seperti pada, file deskriptor 1 ditutup), sementara menutup koneksi SSH akan memiliki efek yang berbeda (deskriptor file akan tetap ada, tetapi tidak terhubung ke apa pun di sisi lain.) Saya pikir intinya masih berdiri, yaitu bahwa grep GNU keluar non-nol jika ia mencoba untuk menulis keluaran dan itu gagal. Ya, solusi terbaik hanya memeriksa status keluar ping secara langsung.exec </dev/null >/dev/null 2>&1
mendekati awal. Dengan begitu jika misalnyaping
memutuskan untuk menulis sesuatu ke stderr itu tidak akan menimbulkan masalah./dev/null
sini, tapi saya bereskan hasilnya. Terima kasih untuk sarannya.