Как я могу пинговать определенный адрес и, когда найден, перестать пинговать.
Я хочу использовать его в скрипте bash, поэтому, когда хост запускается, скрипт продолжает пинговать, и с момента доступности хоста скрипт продолжается ...
источник
Как я могу пинговать определенный адрес и, когда найден, перестать пинговать.
Я хочу использовать его в скрипте bash, поэтому, когда хост запускается, скрипт продолжает пинговать, и с момента доступности хоста скрипт продолжается ...
Дальнейшее упрощение ответа Мартины:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
обратите внимание, что сам ping используется в качестве проверки цикла; как только это удастся, цикл заканчивается. Тело цикла пустое, с нулевой командой " :
", используемой для предотвращения синтаксической ошибки.
Обновление: я подумал о том, как заставить Control-C аккуратно выйти из цикла проверки связи. Это запустит цикл в фоновом режиме, перехватит сигнал прерывания (Control-C) и уничтожит фоновый цикл, если это произойдет:
ping_cancelled=false # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done & # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $! # Wait for the loop to exit, one way or another
trap - SIGINT # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"
Это немного сложновато, но если вы хотите, чтобы цикл был отменяемым, он должен сделать свое дело.
ping
будет ждать 10 секунд, прежде чем отказаться от своего пинга. Если вы хотите уменьшить это до 1 секунды, вы можете использовать-w1
.-W1
kill %1
убить его.Вы можете сделать цикл, отправить один пинг и в зависимости от статуса прервать цикл, например (bash):
Размещение этого где-то в вашем скрипте будет блокировать, пока не
www.google.com
станет доступнымисточник
while true
иbreak
есть более чистое решение, ИМО.while true; do sleep 5; ping ...
Я знаю, что вопрос старый ... и конкретно спрашивает относительно
ping
, но я хотел поделиться своим решением.Я использую это при перезагрузке хостов, чтобы знать, когда я смогу снова подключиться к ним по SSH. (Так
ping
как ответит за несколько секунд доsshd
запуска.)источник
Пингуйте целевой хост один раз. Проверьте, прошел ли пинг (возвращаемое значение пинга равно нулю). Если хост не жив, снова пропингуйте.
Следующий код можно сохранить в виде файла и вызвать с именем хоста в качестве аргумента или удалить из первой и последней строки и использовать в качестве функции в существующем сценарии (имя хоста waitForHost).
Код не оценивает причину сбоя, если эхо-запрос не приводит к ответу, таким образом, зацикливание навсегда, если хост не существует. Моя справочная страница BSD перечисляет значение каждого возвращаемого значения, в то время как linux нет, поэтому я думаю, что это не может быть переносимым, поэтому я и оставил его.
источник
Вы можете удалить сон 1, это только здесь, чтобы предотвратить любую проблему с переполнением в случае, когда хост будет повторно подключен, но ping не будет выходить с кодом 0.
источник
Пожалуйста, смотрите хорошие варианты в stackoverflow . Вот пример в bash, вам придется перебирать следующий код, пока он не вернет успешный результат проверки связи.
источник
Любой из вышеперечисленных циклов также можно использовать с fping, а не с ping, который, IMO, лучше подходит для использования в скриптах, чем сам ping. Смотрите fping (1) для деталей.
также полезно для проверки работоспособности машин перед их выполнением. Простой пример:
источник
Это будет пытаться определенное количество раз.
Вместо эха
$r
вы можете проверить его и действовать в соответствии с его значением:источник
Чтобы приятно обрабатывать SIGINT на пинг BSD.
как функция
источник
Я использовал следующую функцию. Мне это нравится, потому что я могу сказать, чтобы через некоторое время перестать пытаться:
Его можно использовать для запуска чего-либо:
источник
В общем, я хочу дождаться появления своей базы данных или другого сервера, но я не хочу ждать слишком долго. Следующий код ждет 10 секунд, а затем устанавливает код выхода, если сервер не появился в течение указанного времени.
Если сервер появится раньше установленного срока, цикл будет закорочен, чтобы можно было запустить следующий бит кода.
источник
Дальнейшее улучшение ответа Гордона Дэвиссона:
с окружающим '$ ()' запускается подоболочка, и поэтому вы можете использовать Control-C для завершения цикла в случае, если хост не станет доступным.
источник