¿Forma más rápida que hacer ping para verificar si la computadora está en línea?

20

Estoy escribiendo un script de wake on lan para un conjunto de nuestras computadoras de laboratorio. Tenemos sqlite db con una lista de los nombres de host, IP y MAC de la computadora y actualmente hago ping a cada uno de ellos con '-c1' para que no se ejecute interminablemente, pero incluso eso requiere un poco de espera, ¿hay una manera más rápida de obtener responder en lugar de ping? El uso de ping parece ralentizar bastante el script, ya que necesita las respuestas de ping para continuar.

Muchas gracias por cualquier sugerencia!

Jon Phenow
fuente

Respuestas:

20

Enviar un solo paquete y esperar una respuesta será una de las formas más rápidas posibles, y hacer ping es una buena manera de hacerlo. De hecho, dependiendo de su caso de uso, diría que es demasiado rápido , ya que realmente no le dice si el sistema realmente está haciendo algo útil, solo que el subsistema de red del núcleo está vivo y configurado.

Pero suponiendo que sea lo suficientemente bueno, puede hacer algunas mejoras. Primero, puede usar -W1para disminuir el tiempo de espera de ping a un segundo. En segundo lugar, puede hacer que su script haga ping a los diferentes hosts de forma asincrónica (en un hilo de fondo) y verifique los resultados según sea necesario en lugar de esperar.

Alternativamente, puede repensar el enfoque y hacer que los sistemas remotos se registren de alguna manera cuando estén en funcionamiento, y si un sistema no se ha registrado, puede asumir que está inactivo.

mattdm
fuente
Una buena decisión sobre la adición -w, tuvo que ser dos, aunque un montón de computadoras no respondieron lo suficientemente rápido. Podría considerar agregar algún tipo de check-in periódico o un apretón de manos, pero por ahora quiero tener el proceso relativamente externo a las computadoras que estoy encendiendo.
Jon Phenow
1
También uso -s para enviar un paquete más pequeño.
Shawn J. Goff
3
Me sorprendería si enviar un paquete más pequeño marca la diferencia.
mattdm
¿Ya no se han enviado casi al tamaño mínimo de los paquetes?
Jon Phenow
44
Son bastante pequeños; Hay un valor predeterminado de 56 bytes de datos, que podría reducir. Pero en cualquier caso, es más pequeño que el MTU de ethernet y más grande que nada, por lo que se reduce a "un paquete" de cualquier manera.
mattdm
7

Para esto fue diseñado fping. http://fping.sourceforge.net/

Debe analizar la salida después en lugar de confiar en un código de retorno, pero es mucho más rápido que hacer un ping normal.

Thorbjørn Ravn Andersen
fuente
Creo que es un poco divertido que la descripción diga "A diferencia del ping, el fping está destinado a usarse en scripts y su salida es fácil de analizar". y, sin embargo, no proporciona un código de retorno
Adam Plocher
¿Cuáles serían los buenos valores para el código de retorno?
Thorbjørn Ravn Andersen
3

Esto solo funcionaría para una o dos computadoras, pero si las conecta directamente a la computadora responsable de verificar su estado, puede usar ethtoolpara ver si el enlace está activo o no.

LawrenceC
fuente
No he usado ethtool para esto, ¿le gustaría dar un ejemplo? (o tal vez un enlace)?
Johan
ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'volverá yessi una máquina está conectada y nosi no lo está.
LawrenceC
2

Lo que podría hacer es hacer ping a la dirección de transmisión, lo que debería hacer que todas las computadoras vuelvan a hacer ping. Luego, podría comparar esta lista con lo que tiene en SQLite para asegurarse de que todas las computadoras estén en funcionamiento.

Aparte de eso, un ping es probablemente la forma más rápida de garantizar que una computadora esté despierta en una red. Como se menciona en la otra respuesta, esto no proporciona datos realmente útiles. Si tiene la capacidad de instalar scripts, puede agregar un cronjob para hacer ping a un servidor central, ejecutar una tarea o simplemente hacer eco de la lista de procesos en un servidor central que registrará la solicitud. Luego, simplemente verifique que le dirá si tiene algún problema sin necesidad de verificarlo manualmente cada vez.

Josh K
fuente
1
Supongo que te refieres a hacer ping a la dirección de transmisión, no a la puerta de enlace. En sistemas modernos, eso probablemente no funcionará. Ver unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm
1
@mattdm: ¿ Multidifusión entonces? No sabía que la mayoría de la gente lo apagaba. No he tenido problemas con eso antes.
Josh K
Jaja sí, gracias mattdm, un problema similar que puedes ver me encontré. no es que las personas los apaguen, pero generalmente vienen con la transmisión apagada últimamente.
Jon Phenow
Podría usar fping ( fping.sourceforge.net ) para hacer ping a una lista de hosts en paralelo. Entonces no tiene que confiar en poder hacer ping a la dirección de transmisión.
mazianni
2

Ganglia usa tráfico de multidifusión para monitorear muchos hosts en un clúster, ¿tal vez podría usar algo similar? Esto supone que su hardware de red permite el tráfico de multidifusión entre todos los hosts y su sistema de monitoreo.

jsbillings
fuente
1
Parece una herramienta genial, pero para los propósitos de este pequeño script podría agregar un trozo innecesario al proyecto, manteniéndolo como un script bastante pequeño por ahora. Sin embargo, definitivamente lo mantendré atento, parece una herramienta que podría usar pronto.
Jon Phenow
0

Tuve el mismo problema y se me ocurrió el siguiente script (rápido y sucio). Esto esencialmente emite todos los pings como trabajos separados en paralelo y escaneará una subred completa / 24 en 3 segundos; tenga en cuenta que por alguna razón no me molesté en descubrir que no podía usar el código de resultado de ping aquí, pero grep -v hizo el trabajo:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac
Mirar
fuente
0

Cía,

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */
Joe
fuente
0

He encontrado fping -r0 ...para proporcionar la respuesta más rápida.

La -ropción (reintentar) parece más rápida que la similar -c(cuenta). El uso de -r0resultados solo se envía un ping y la salida se abrevia mucho en comparación con otras opciones.

En mi sistema ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

Resultados en ...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

Un poco de masaje para deshacerme de los ICMPmensajes me da ...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

En cuanto a la velocidad, fpingen este viejo Intel Dual-Core de 1.8GHz con 4GB de RAM es ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

Y el grepy sortparece agregar solo 0.001-0.004s al tiempo ...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

NOTAS

  • El ICMPmensaje no aparece en cada ejecución.
  • El 2>&1es necesaria para evitar que el ICMPmensaje de aparecer en la salida, ya que se envía al stderrlugar de stdout.
DocSalvager
fuente