Solución 1:
Una simplificación adicional de la respuesta de Martynas:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
tenga en cuenta que el propio ping se utiliza como prueba de bucle; tan pronto como tiene éxito, el ciclo termina. El cuerpo del ciclo está vacío, con el comando nulo ":
" utilizado para evitar un error de sintaxis.
Actualización:pensé en una forma de hacer que Control-C salga del ciclo de ping limpiamente. Esto ejecutará el ciclo en segundo plano, capturará la señal de interrupción (Control-C) y eliminará el ciclo en segundo plano si ocurre:
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"
Es un poco tortuoso, pero si quieres que el bucle se pueda cancelar, debería funcionar.
Solución 2:
Sé que la pregunta es antigua... y específicamente pregunta sobre ping
, pero quería compartir mi solución.
Lo uso cuando reinicio los hosts para saber cuándo puedo volver a utilizar SSH en ellos. (Desde ping
responderá durante varios segundos antes del sshd
se inicia.)
until nc -vzw 2 $host 22; do sleep 2; done
Solución 3:
Puede hacer un ciclo, enviar un ping y, según el estado, romper el ciclo, por ejemplo (bash):
while true; do ping -c1 www.google.com > /dev/null && break; done
Poner esto en algún lugar de su secuencia de comandos se bloqueará, hasta www.google.com
se puede hacer ping.
Solución 4:
Haga ping al host de destino una vez. Compruebe si el ping tuvo éxito (el valor de retorno del ping es cero). Si el host no está vivo, vuelva a hacer ping.
El siguiente código puede guardarse como un archivo y llamarse con el nombre de host como argumento, o quitarse la primera y la última línea y usarse como función dentro de un script existente (waitForHost hostname).
El código no evalúa la causa de la falla si el ping no da como resultado una respuesta, por lo que se repite para siempre si el host no existe. Mi página de manual de BSD enumera el significado de cada valor devuelto, mientras que la de Linux no, así que supongo que esto podría no ser portátil, por eso lo dejé fuera.
#!/bin/bash
PING=`which ping`
function waitForHost
{
if [ -n "$1" ];
then
waitForHost1 $1;
else
echo "waitForHost: Hostname argument expected"
fi
}
function waitForHost1
{
reachable=0;
while [ $reachable -eq 0 ];
do
$PING -q -c 1 $1
if [ "$?" -eq 0 ];
then
reachable=1
fi
done
sleep 5
}
waitForHost $1
Solución 5:
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done
Puede eliminar la suspensión 1, solo está aquí para evitar cualquier problema de inundación en caso de que se pueda acceder al host pero el ping no salga con el código 0.