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:
$ ./ping_server.sh
waiting for ServerXY ....................
Server is back online
$ cat ./ping_server.sh
#!/bin/bash
printf "%s" "waiting for ServerXY ..."
while ! ping -c 1 -n -w 1 147.153.237.192 &> /dev/null
do
printf "%c" "."
done
printf "\n%s\n" "Server is back online"
Larutan
Solusi yang jelas adalah menggunakan -w 1
. Jika Anda bermaksud menggunakan nilai yang lebih rendah dari 1 detik, timeout
perintahnya harus lebih baik:
$ timeout 0.2 ping -c 1 147.153.237.192
PING 147.153.237.192 (147.153.237.192) 56(84) bytes of data.
64 bytes from 147.153.237.192: icmp_seq=1 ttl=124 time=2.61 ms
--- 147.153.237.192 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.612/2.612/2.612/0.000 ms
Sekali lagi, gunakan dengan !
operator di loop:
#!/bin/bash
printf "%s" "waiting for ServerXY ..."
while ! timeout 0.2 ping -c 1 -n 147.153.237.192 &> /dev/null
do
printf "%c" "."
done
printf "\n%s\n" "Server is back online"
Tentu saja yang sebaliknya dapat diterapkan untuk menampilkan pesan hanya jika server naik dan melaporkan ketika server turun, contoh:
$ while ping -q -c 1 172.16.127.2 >/dev/null ; do sleep 1; done ; echo "Server stopped responding"
Server stopped responding
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
dari ncat
(yang merupakan versi perbaikan dari nc
). Sesuatu seperti pada loop di atas akan berfungsi dengan baik alih-alih ping
:
nc -w5 -z 172.16.127.2 80
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
dan ping
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.