Я пишу сценарий, перезагружающий различные серверы. После перезагрузки я хочу «подождать», пока все серверы не вернутся в сеть. (Чтобы все было просто, я определил для меня онлайн = pingable)
Итак, для каждого сервера я делаю
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
То, что я ожидал бы (и как), было бы результатом, например,
waiting for ServerXY .................
ServerXY is back online!
, где точки .... появлялись один за другим.
Но то, что на самом деле происходит, во-первых, существует только
waiting for ServerXY ...
для а затем, когда сервер вернулся, я получаю последнюю точку и последнюю строку, такую как
waiting for ServerXY ....
ServerXY is back online!
. Почему цикл while выполняется дважды, как один раз, когда происходит сбой ping и один раз с последующим ping? Что мне нужно изменить, чтобы получить больше точек, добавленных в цикл while?
Я также проверил тест с несуществующим IP-адресом. Но он застрял с
waiting for NonExistentServer...
и никогда не прекращался, конечно. Но тот же вопрос, почему нельзя добавить ........?
Проблема в том, что вы установили -w 0.2. Когда значение меньше 1, значения предельного срока (-w) и времени ожидания (-W) игнорируются. Об этом уже упоминалось в этом вопросе. Когда вы используете -w 1, ваш скрипт (который я слегка изменил для удаления бесполезных битов) работает правильно:
$ ./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"
Очевидным решением является использование -w 1. Если вы намереваетесь использовать значение менее 1 секунды, команда timeout должна быть лучше:
$ 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
Опять же, используйте его с оператором ! в цикле:
[ f3]Проблема в том, что вы установили -w 0.2. Когда значение меньше 1, значения предельного срока (-w) и времени ожидания (-W) игнорируются. Об этом уже упоминалось в этом вопросе. Когда вы используете -w 1, ваш скрипт (который я слегка изменил для удаления бесполезных битов) работает правильно:
$ ./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"
Очевидным решением является использование -w 1. Если вы намереваетесь использовать значение менее 1 секунды, команда timeout должна быть лучше:
$ 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
Опять же, используйте его с оператором ! в цикле:
#!/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"
Проблема в том, что вы установили -w 0.2. Когда значение меньше 1, значения предельного срока (-w) и времени ожидания (-W) игнорируются. Об этом уже упоминалось в этом вопросе. Когда вы используете -w 1, ваш скрипт (который я слегка изменил для удаления бесполезных битов) работает правильно:
$ ./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"
Очевидным решением является использование -w 1. Если вы намереваетесь использовать значение менее 1 секунды, команда timeout должна быть лучше:
$ 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
Опять же, используйте его с оператором ! в цикле:
#!/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"