Bash ждет успеха ping

Я пишу сценарий, перезагружающий различные серверы. После перезагрузки я хочу «подождать», пока все серверы не вернутся в сеть. (Чтобы все было просто, я определил для меня онлайн = 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...

и никогда не прекращался, конечно. Но тот же вопрос, почему нельзя добавить ........?

4
задан 27 June 2017 в 19:33

3 ответа

Проблема

Проблема в том, что вы установили -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]
1
ответ дан 22 May 2018 в 21:06
  • 1
    Привет, большое спасибо за очищение этой вещи! Есть ли другой способ, чем делать это в условиях цикла? Он идеально подходит для ожидания одного сервера, но, как уже упоминалось, я жду нескольких серверов позже, я сделал что-то вроде while (( $ServerA_W==1 || $ServerB_W==1 || .....)), которое сохраняется, когда каждый сервер вернулся. – derHugo 28 June 2017 в 08:12
  • 2
    После, например, один сервер снова ждет других, я не хочу пинговать тот, который уже вернулся;) – derHugo 28 June 2017 в 08:20
  • 3
    Я бы предложил написать это как функцию и запустить экземпляр каждой функции с ip-адресом в качестве аргумента в фоновом режиме. Но я бы рекомендовал не печатать точки, просто чтобы каждая функция печатала сообщение при появлении сервера. Дайте мне знать, если вы хотите, чтобы я написал пример такой функции – Sergiy Kolodyazhnyy 28 June 2017 в 08:28
  • 4
    Точки - это только фаза отладки;) позже я покажу все серверы в строках и обновляю соответствующую строку, когда сервер вернется. Я не специалист по потоку из сценария и предпочел бы иметь возможность просто держать полный скрипт Ctrl C в случае, если, например, один сервер никогда не возвращается. В любом случае спасибо, что ваш ответ уже решил вопрос :) позже Я мог бы вернуться с новым вопросом, стоящим перед дальнейшим материалом, который вы адресуете – derHugo 28 June 2017 в 08:32
  • 5
    Привет, я тестирую тайм-аут. Проблема: таймаут 0.2 кажется коротким, поэтому пинг никогда не преуспевает ... хотя он говорит, что через секунды, если я ставлю 2, это еще способ быстро ... – derHugo 28 June 2017 в 12:04

Проблема

Проблема в том, что вы установили -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"
1
ответ дан 18 July 2018 в 11:01

Проблема

Проблема в том, что вы установили -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"
2
ответ дан 24 July 2018 в 19:42

Другие вопросы по тегам:

Похожие вопросы: