GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer ping en Linux hasta que se conozca el host?

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.


Linux
  1. Cómo instalar y usar el comando ping en Linux

  2. Cómo deshabilitar las respuestas de ping en Linux usando icmp_echo_ignore_all

  3. ¿Cómo recorrer directorios en Linux?

  4. ¿Cómo puedo habilitar Ping en una máquina virtual Azure Linux?

  5. Linux:haga ping a todo el host en la subred

Cómo instalar y usar el comando Ping en Linux

Cómo hacer ping a un número de puerto en Linux

Cómo funciona el programa ping en Linux

Comando ping de Linux

Cómo hacer una copia de seguridad de un host Linux remoto usando la utilidad rsync de rsnapshot

Cómo deshabilitar la verificación de clave de host SSH en Linux