Uma simplificação adicional da resposta de Martynas:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
observe que o próprio ping é usado como teste de loop; assim que for bem-sucedido, o loop termina. O corpo do loop está vazio, com o comando nulo " :
" usado para evitar um erro de sintaxe.
Atualização: Eu pensei em uma maneira de fazer o Control-C sair do loop de ping de forma limpa. Isso executará o loop em segundo plano, interceptará o sinal de interrupção (Control-C) e matará o loop em segundo plano, se ocorrer:
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"
É um pouco tortuoso, mas se você quiser que o loop seja cancelável, ele deve fazer o truque.
ping
, aguarde 10 segundos antes de desistir de seu ping. Se você deseja reduzir isso para 1 segundo, pode usar-w1
.-W1
kill %1
matá-lo.Você pode fazer um loop, enviar um ping e, dependendo do status, interromper o loop, por exemplo (bash):
Colocar isso em algum lugar do seu script irá bloquear, até que
www.google.com
seja pingável.fonte
while true
ebreak
é a solução mais limpa, IMO.while true; do sleep 5; ping ...
Eu sei que a pergunta é antiga ... e especificamente pergunta a respeito
ping
, mas eu queria compartilhar minha solução.Eu uso isso ao reiniciar hosts para saber quando posso voltar a SSH para eles novamente. (Como
ping
responderá por alguns segundos antes desshd
iniciar.)fonte
Faça ping no host de destino uma vez. Verifique se o ping foi bem-sucedido (o valor de retorno do ping é zero). Se o host não estiver ativo, execute ping novamente.
O código a seguir pode ser salvo como um arquivo e chamado com o nome do host como argumento ou retirado da primeira e da última linha e usado como função em um script existente (waitForHost hostname).
O código não avalia a causa da falha se o ping não resultar em uma resposta, fazendo um loop para sempre se o host não existir. Minha página de manual do BSD lista o significado de cada valor de retorno, enquanto o linux não, então acho que isso pode não ser portátil, por isso deixei de fora.
fonte
Você pode remover o sono 1, está aqui apenas para evitar qualquer problema de inundação, caso o host possa ser acessado, mas o ping não sairá com o código 0.
fonte
Por favor, veja boas opções em stackoverflow . Aqui está um exemplo no bash, você terá que repetir o código a seguir até que ele retorne um resultado de ping com êxito.
fonte
qualquer um dos loops acima também pode ser usado com fping em vez de ping, o que, como IMO, é mais adequado para uso em scripts do que o próprio ping. Veja fping (1) para detalhes.
também é útil para testar se as máquinas estão funcionando antes de fazer algo nelas. Um exemplo simples:
fonte
Isso tentará um determinado número de vezes.
Em vez de ecoar
$r
, você pode testá-lo e agir de acordo com seu valor:fonte
Para lidar bem com o ping do SIGINT no BSD.
Como uma função
fonte
Eu tenho usado a seguinte função. Gosto porque posso dizer para parar de tentar depois de um tempo:
Pode ser usado assim para iniciar algo:
fonte
Em geral, quero esperar que meu banco de dados ou outro servidor seja exibido, mas não quero esperar muito . O código a seguir aguarda 10 segundos e define o código de saída se o servidor não aparecer dentro do prazo.
Se o servidor aparecer antes do prazo, o loop será curto-circuito para que o próximo bit de código possa ser executado.
fonte
Um aprimoramento adicional à resposta de Gordon Davisson:
com o '$ ()' circundante, um subshell é iniciado e, portanto, você pode usar Control-C para finalizar o loop no caso de o host não ficar disponível.
fonte