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 ping en sí se usa como prueba de bucle; Tan pronto como tiene éxito, el ciclo termina. El cuerpo del bucle 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 limpiamente del bucle de ping. Esto ejecutará el bucle en segundo plano, atrapará la señal de interrupción (Control-C) y matará el bucle de fondo 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 sea cancelable, debería ser suficiente.
ping
esperará 10 segundos antes de renunciar a su ping. Si desea reducir eso a 1 segundo, puede usarlo-w1
.-W1
kill %1
matarlo.Puede hacer un bucle, enviar un ping y, según el estado, romper el bucle, por ejemplo (bash):
Poner esto en algún lugar de su script se bloqueará, hasta que
www.google.com
sea pingable.fuente
while true
ybreak
es la solución más limpia, OMI.while true; do sleep 5; ping ...
Sé que la pregunta es antigua ... y específicamente pregunta sobre
ping
, pero quería compartir mi solución.Lo uso cuando reinicio hosts para saber cuándo puedo volver a SSH en ellos. (Dado
ping
que responderá durante varios segundos antes desshd
comenzar).fuente
Haga ping al host de destino una vez. Verifique si el ping tuvo éxito (el valor de retorno de ping es cero). Si el host no está vivo, haga ping nuevamente.
El siguiente código puede guardarse como un archivo y llamarse con el nombre de host como argumento, o despojarse de la primera y ú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 produce una respuesta, por lo tanto, se repite para siempre si el host no existe. Mi página de manual de BSD enumera el significado de cada valor de retorno, mientras que el de Linux no, así que supongo que esto podría no ser portátil, por eso lo omití.
fuente
Puede eliminar el sueño 1, solo está aquí para evitar cualquier problema de inundación en caso de que el host sea alcanzable pero el ping no salga con el código 0.
fuente
Por favor vea buenas opciones en stackoverflow . Aquí hay una muestra en bash, tendrá que recorrer el siguiente código hasta que devuelva un resultado de ping exitoso.
fuente
cualquiera de los bucles anteriores también se puede usar con fping en lugar de ping, lo que, en mi opinión, es más adecuado para usar en scripts que el ping en sí. Ver fping (1) para más detalles.
También es útil para probar si las máquinas están funcionando antes de hacer algo en ellas. Un simple ejemplo:
fuente
Esto lo intentará un número dado de veces.
En lugar de hacer eco
$r
, puede probarlo y actuar de acuerdo con su valor:fuente
Para manejar bien el SIGINT en ping BSD.
como una función
fuente
He estado usando la siguiente función. Me gusta porque puedo decirle que deje de intentarlo después de un tiempo:
Se puede usar así para lanzar algo:
fuente
En general, quiero esperar a que aparezca mi base de datos u otro servidor, pero no quiero esperar demasiado . El siguiente código espera durante 10 segundos, luego establece el código de salida si el servidor no apareció dentro del límite de tiempo.
Si el servidor aparece antes del límite de tiempo, el bucle se cortocircuitará para que se pueda ejecutar el siguiente bit de código.
fuente
Una mejora adicional a la respuesta de Gordon Davisson:
con el '$ ()' circundante se inicia una subshell y, por lo tanto, puede usar Control-C para terminar el ciclo en caso de que el host no esté disponible.
fuente