O problema
O problema é que você definiu -w 0.2
. Quando o valor está abaixo de 1, os valores de prazo final ( -w
) e tempo limite ( -W
) são ignorados. Isso foi mencionado anteriormente em esta pergunta . Quando você usa -w 1
, seu script (que eu modifiquei ligeiramente para remover bits inúteis) funciona corretamente:
$ ./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"
Solução
A solução óbvia é usar -w 1
. Se você pretende usar um valor menor que 1 segundo, o comando timeout
deve ser melhor:
$ 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
Novamente, use-o com o operador !
no 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"