Saya menulis pada skrip yang me-reboot berbagai Server. Setelah reboot saya ingin "menunggu" sampai semua Server kembali online. (Untuk menjaga hal-hal sederhana yang saya definisikan untuk saya online = pingable)
Jadi untuk setiap Server saya lakukan
ServerXY_W=1
echo -n "waiting for ServerXY ..."
while (($ServerXY_W == 1))
do
if ping -c 1 -w 0.2 192.168.123.123 &> /dev/null
then
echo "ServerXY is back online!"
ServerXY_W=0
else
echo -n "."
fi
done
Apa yang saya harapkan (dan sukai) akan menjadi output seperti misalnya
waiting for ServerXY .................
ServerXY is back online!
di mana titik-titik .... akan muncul satu per satu.
Tetapi yang sebenarnya terjadi adalah pertama hanya ada
waiting for ServerXY ...
untuk sementara dan ketika Server kembali saya mendapatkan titik terakhir dan baris terakhir seperti
waiting for ServerXY ....
ServerXY is back online!
Mengapa loop sementara hanya dilakukan dua kali seperti sekali dengan ping gagal dan sekali dengan ping berhasil? Apa yang harus saya ubah untuk mendapatkan lebih banyak titik dalam loop sementara?
Saya melakukan tes juga dengan IP yang tidak ada. Tapi itu macet dengan
waiting for NonExistentServer...
dan tentu saja tidak pernah dihentikan. Tetapi pertanyaan yang sama mengapa tidak ........
ditambahkan?
Jawaban:
Masalah
Masalahnya adalah Anda telah mengatur
-w 0.2
. Ketika nilai di bawah 1, nilai batas waktu (-w
) dan batas waktu (-W
) diabaikan. Ini telah disebutkan sebelumnya dalam pertanyaan ini . Saat Anda menggunakan-w 1
, skrip Anda (yang saya sedikit modifikasi untuk menghilangkan bit yang tidak berguna) berfungsi dengan baik:Larutan
Solusi yang jelas adalah menggunakan
-w 1
. Jika Anda bermaksud menggunakan nilai yang lebih rendah dari 1 detik,timeout
perintahnya harus lebih baik:Sekali lagi, gunakan dengan
!
operator di loop:Tentu saja yang sebaliknya dapat diterapkan untuk menampilkan pesan hanya jika server naik dan melaporkan ketika server turun, contoh:
Namun perlu dicatat, ini tidak sempurna:
kami melakukan ping hanya dengan 1 paket setiap detik. Bandwidth rendah, konektivitas buruk, perangkat keras buruk di antara server dan ping klien server akan memicu loop untuk keluar dan membuat pemberitahuan positif palsu
Kami mengandalkan ping, yaitu menggunakan gema ICMP. Firewall atau bahkan server individual memblokir respons terhadap gema ping / ICMP. Anda bisa menggunakan
nc
darincat
(yang merupakan versi perbaikan darinc
). Sesuatu seperti pada loop di atas akan berfungsi dengan baik alih-alihping
:Apa yang dilakukan adalah terhubung ke server pada 172.16.127.2 pada port 80.
-z
adalah untuk menghindari I / O - cukup sambungkan dan lepaskan.-w
adalah menunggu 5 detik sebelum melaporkan koneksi gagal. Tentu saja ini cukup bagus ketika Anda memiliki server di bawah kendali Anda dan Anda tahu port 80 terbuka. UPD dapat digunakan dengan baik, tetapi jika ada firewall, TCP mungkin lebih disukai.Manfaat tersembunyi di sini adalah bahwa jika Anda memiliki beberapa layanan berjalan pada port tertentu (seperti HTTP pada port 80 atau RTSP pada 554), gagal menyambung ke port dapat berfungsi sebagai indikator layanan Anda perlu restart.
Tentu saja,
nc
danping
bisa sedikit spam. Cara yang lebih baik adalah melakukan check-in server dengan server pusat lain, mengirim laporan berkala, mungkin setiap jam; dengan cara itu jika server Anda melewatkan "waktu punch" Anda dapat menghasilkan kesalahan. Cara yang lebih baik adalah dengan menggunakan layanan seperti Nagios, yang melakukan itu. Tetapi pada titik ini kita memasuki ranah komputasi tingkat perusahaan dengan beberapa server. Jika Anda memiliki sesuatu seperti Raspberry Pi di rumah, Anda mungkin tidak perlu sesuatu yang rumit.sumber
while (( $ServerA_W==1 || $ServerB_W==1 || .....))
yang berlaku ketika setiap server kembali.