Il problema
Il problema è che hai impostato -w 0.2. Quando il valore è inferiore a 1, i valori deadline ( -w) e timeout ( -W) vengono ignorati. Questo è stato menzionato in precedenza in questa domanda . Quando usi -w 1, il tuo script (che ho leggermente modificato per rimuovere i bit inutili) funziona correttamente:
$ ./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"
Soluzione
La soluzione ovvia è usare -w 1. Se si intende utilizzare un valore inferiore a 1 secondo, il timeoutcomando dovrebbe essere migliore:
$ 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
Ancora una volta, usalo con l' !operatore nel ciclo:
#!/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"
Ovviamente si può applicare il contrario per mostrare il messaggio solo se il server è attivo e segnalare quando il server non funziona, ad esempio:
$ while ping -q -c 1 172.16.127.2 >/dev/null ; do sleep 1; done ; echo "Server stopped responding"
Server stopped responding
Nota, tuttavia, questo non è perfetto:
stiamo eseguendo il ping con solo 1 pacchetto al secondo. Bassa larghezza di banda, scarsa connettività, hardware difettoso tra il server e il client che eseguono il ping del server attiveranno il loop per uscire ed effettuare una notifica falsa positiva
Facciamo affidamento sul ping, ovvero sull'eco ICMP. I firewall o anche i singoli server bloccano le risposte all'eco ping / ICMP. Si potrebbe usare ncdi ncat(che è una versione migliorata del nc). Qualcosa come nel loop sopra funzionerà bene invece di ping:
nc -w5 -z 172.16.127.2 80
Quello che fa è connettersi al server su 172.16.127.2 sulla porta 80. -zè evitare l'I / O: basta connettersi e disconnettersi. -wdeve attendere 5 secondi prima di segnalare una connessione non riuscita. Naturalmente questo è abbastanza buono quando hai un server sotto il tuo controllo e sai che la porta 80 è aperta. UPD può essere usato bene, ma se è attivo un firewall, probabilmente è preferibile TCP.
Un vantaggio nascosto qui è che se si dispone di un servizio in esecuzione su una porta specifica (come HTTP sulla porta 80 o RTSP su 554), la mancata connessione alla porta può servire come indicatore del servizio che deve essere riavviato.
Certo, nce pingpuò essere un po 'spammy. Il modo migliore sarebbe quello di fare il check-in del server con un altro server centrale, inviare un rapporto periodico, forse ogni ora; in questo modo se il tuo server perde un "punch time" puoi generare errori. Il modo migliore è utilizzare un servizio come Nagios, che lo fa. Ma a questo punto stiamo entrando nel regno dell'informatica di livello aziendale con più server. Se hai qualcosa come Raspberry Pi a casa, probabilmente non hai bisogno di nulla di complesso.