¿Cómo puedo establecer un tiempo de espera corto con el comando ping?

49

Estoy tratando de escribir un script que enumere todos los hosts en mi LAN (hay unos 20 de ellos) y escribe el estado de ping junto a cada host. Tengo el archivo de arrendamientos DHCP, así que tengo todas las IP (por ejemplo, 10.0.0.1, 10.0.0.2, etc.), todo lo que necesito es el estado de ping para cada host.

Entonces, mi script lanza un solo ping para cada host:

ping -c 1 10.0.0.1

Desafortunadamente, cuando un host está fuera de línea, el ping demora mucho tiempo. Lo comprobé man ping, parece que hay dos opciones para configurar el tiempo de espera: -w deadliney -W timeout. Creo que estoy interesado en lo último.

Entonces intenté esto:

ping -c 1 -W 1 10.0.0.1

Pero esperar un segundo por host sin conexión todavía es demasiado largo. Intenté establecerlo por debajo de un segundo, pero no parece tener en cuenta el parámetro en absoluto:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

¿Hay alguna manera de establecer el tiempo de espera en un valor inferior? Si no, ¿hay alguna alternativa?

Editar

  • El sistema operativo es Debian Lenny.
  • Los hosts que estoy intentando hacer ping son en realidad puntos de acceso. Están en la misma vlan y subred que los usuarios (por simplicidad de implementación y reemplazo). Es por eso que no quiero escanear toda la subred (con un ping -bpor ejemplo).

Editar # 2

Acepté la fpingsolución (gracias por todas las otras respuestas). Este comando hace exactamente lo que estaba buscando:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

Este comando tarda como máximo 500 ms en completarse y me da el estado de ping de todos los hosts a la vez:

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

En Debian Lenny, la instalación es trivial:

aptitude update
aptitude install fping
MiniQuark
fuente

Respuestas:

41

fping podría ser una herramienta mejor que el stock ping que está utilizando. ¿En qué sistema operativo estás?

  • "fping difiere del ping en que puede especificar cualquier número de objetivos en la línea de comando, o especificar un archivo que contenga las listas de objetivos para hacer ping".
  • "En lugar de enviar a un objetivo hasta que se agote el tiempo de espera o responda, fping enviará un paquete de ping y pasará al siguiente objetivo en una ronda".
  • "A diferencia del ping, fping está destinado a usarse en scripts, por lo que su salida está diseñada para ser fácil de analizar".
AndyN
fuente
1
Funciona muy bien, gracias, esto es lo que estaba buscando. Este comando funciona bien: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... Todo dura medio segundo, y obtengo los resultados para todos los hosts a la vez. Excelente herramienta :-))
MiniQuark
38

Para las personas que buscan una solución que implique ping, use el -iinterruptor.

ping -i 0.2 www.google.com

O, si desea usar 0.1, deberá ejecutarlo como root

sudo ping -i 0.1 www.google.com

No es necesario descargar utilidades adicionales.

Victor Bjelkholm
fuente
44
+1 de mi parte Este es el primer resultado al buscar en Google "ping timeout", y esto es exactamente lo que estaba buscando.
Steven Jeffries
@StevenJeffries ¡Lo mismo aquí!
Luc
1
En caso de host muerto, esta solución imprimirá su primer resultado útil después de aproximadamente 1 segundo. Esta es definitivamente una respuesta incorrecta como @MarcelBurkhard ya mencionó.
Victor Yarema
1
El problema con esta solución es que -i 0.1 NO esperará 100 ms, sino más tiempo, para pings que demoren más de 100 ms, lo que anula el tiempo.
Llamageddon el
2
Esta respuesta es incorrecta, no cambia cuánto tiempo pingesperará una respuesta, sino que simplemente envía pings consecutivos más rápido ...
Mtl Dev
21

Puede establecer un tiempo de espera corto con el timeoutcomando en Ubuntu / Debian:

timeout 0.2 ping -c1 fqdn || { do_work }
Jordon Bedwell
fuente
¡Buena respuesta! Ahora lo hice: tiempo de espera 1 ping -c 1 test.com
vrijdenker
1
Mi versión de tiempo de espera solo acepta 1 segundo. timeout (GNU coreutils) 8.4.
slm
Me gusta esta solución, se puede aplicar a todos los demás comandos
datdinhquoc
@slm, es extraño que su versión no sea compatible con menos de un segundo. A mí me funciona: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... En mis man timeoutinformes de casos GNU coreutils 8.26. BWT, estoy usando Ubuntu 17.04.
Victor Yarema
Esto es realmente lo único que funciona si desea disminuir los tiempos de espera (el host no responde) ... Sin embargo, debe hacer los cálculos: el tiempo de espera debe ser mayor que "-c" * "-i" del comando ping-
Marki
13

Estaría usando nmap para esta tarea.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

Consulte la documentación de nmap para obtener más detalles al respecto.

pausado
fuente
Buena llamada .. Esta es la forma "impresionante" para hacerlo: D 1
Arenstar
Hola, acabo de intentar esto, pero recibí el siguiente mensaje de error: "--host-timeout se especifica en milisegundos a menos que lo califiques agregando 's', 'm', 'h' o 'd'. El valor debe ser superior a 1500 milisegundos ".
MiniQuark
Creo que el problema es obvio, el tiempo de espera no puede ser inferior a 1500 ms. Entonces deberías buscar las opciones de nmap paralelismo que creo.
pacey
Esto parece enviar solo una solicitud. Estoy buscando detección continua de fallas, llegué a Google buscando "tiempo de espera de milisegundos de ping", ¿nmap ofrece infinie-pings como lo hace ubuntu ping?
ThorSummoner
establecer el tiempo de espera a algo inferior a un segundo implicará el uso de un usuario con privilegios como en respuesta @ Victor-bjelkholm
thrau
4

es posible que desee ver la herramienta arp ping si todos sus hosts están en la LAN física. Hace lo mismo pero usa los paquetes arp de capa 2 para hacer el 'ping'. Puede usar una combinación de arpping y icmp ping, o de hecho tcp ping, para determinar cuál es la falla. El ejemplo es un bloqueo de la pila tcp, aunque es raro en estos días, podríamos encontrar si una pila tcp de la máquina se ha bloqueado, ya que la máquina no respondería al ping, pero respondería a arp (que es un código diferente en el host) .

utilizando una combinación de arpping, tcpping e icmp ping, puede averiguar si el servicio en la máquina se ha bloqueado, la pila de tcp se ha bloqueado o la máquina se ha bloqueado por completo. Si ha administrado conmutadores Ethernet, puede obtener datos de enlace físico, revelando si la máquina está realmente encendida o si se ha desconectado físicamente. Tuvimos una situación en la que las máquinas (clientes en salas públicas) estarían apagadas, reunimos esos datos y los paquetes lanzados de estela para encender las máquinas. :-)

Independientemente de las soluciones que cree, si su red está ocupada, piense en implementar algún tipo de qos, de modo que sus paquetes de monitoreo tengan prioridad en la red, y la pérdida de paquetes de medición debido a la congestión de la red puede generar falsas alarmas. Si usa qos para monitorear paquetes, entonces deberá pensar en recopilar datos sobre la utilización de la red.

Por lo tanto, puede hacer que su solución de monitoreo sea tan compleja o fácil como desee. Encontramos que incluso el sistema de monitoreo más elemental es un paso en la dirección correcta, al menos algún administrador vigila las máquinas :-).

¡buena suerte!

El conserje de Unix
fuente
3

@ jordon-bedwell tiene una gran sugerencia.

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux explica que los tiempos de espera de ping solo comienzan después de que se haya determinado la dirección IP. Si usa un dns y su estación de trabajo está fuera de línea, entonces ping no puede determinar la dirección IP y parece esperar aproximadamente 20 segundos por defecto antes de devolver falso.

El uso de la herramienta 'timeout' de linux proporciona más control al ejecutar ping con un nombre de dominio.

Gracias chicos

Digc
fuente
2

Use el interruptor -w , tanto en Windows como en Debian.

Es una manera rápida de verificar si la máquina responde, suponiendo que responda a tiempo menos de la cantidad de segundos especificada.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
NXT
fuente
1

Si puede escanear su subred (o parte de ella) sin activar alarmas de seguridad, y no le importa un poco de datos adicionales, Angry IP Scanner es rápido, gratuito, le permite hacer clic para ordenar por estado y puede proporcionar información más detallada .

Pablo
fuente
0

¿Por qué no iniciar ping en segundo plano, con salida a un archivo temporal, en paralelo para cada host? Luego duerma un segundo, elimine los procesos de ping que aún se estén ejecutando y lea los archivos para recopilar la salida.

dfranke
fuente
1
Supongo que funcionaría, pero estaba buscando una solución más simple. Gracias de cualquier manera.
MiniQuark
Este método no se escala.
Synetech
0

El tiempo de espera es un valor entero que indica hasta qué punto se puede enviar el paquete. Los valores por debajo de 1 no tienen sentido. Un valor de 1 indica que solo está haciendo ping a vecinos inmediatos.

La única forma de acelerar las cosas es realizar una verificación de antecedentes y cosechar los resultados. Esto es lo que hacen herramientas como Nagios.

BillThor
fuente
2
Lo siento, pero realmente no creo que esto sea cierto. La página del manual es bastante clara: -W especifica el "Tiempo de espera de una respuesta, en segundos"; no es adimensional, y aunque el ping no respeta los valores inferiores a 1 (de ahí la pregunta), los tiempos de espera por segundo no carecen de sentido. Si me perdona, puede estar confundiendo -W con -t, este último configura el campo IP TTL (conteo de saltos), que se comporta como lo ha descrito, y donde los valores por debajo de 1 no tienen sentido.
MadHatter apoya a Monica el
-W es el momento en que el proceso de ping espera una respuesta, y puede tener sentido establecerlo muy por debajo del conteo de saltos cuando el conteo de saltos es alto, lo que normalmente es. A los tres segundos, generalmente está entrando en condiciones de reintento. Algunas herramientas pueden permitir el uso de un temporizador de grano fino para esperas, pero para la mayoría de los usos del ping, los segundos son una unidad razonable.
BillThor
0

Podrías probar algo como esto. Pero tarda 15 minutos en ejecutarse.

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a=`expr $a - 1`
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log
Veggie Vampiro
fuente
Parece nmapque sería la herramienta adecuada para el trabajo.
kasperd
0

prueba esto:

ping -n 5 1.2.3.4.5 >nul
Micky
fuente
¿Cómo es esto mejor que fping?
pollitos
-1

ping tiene opciones [-t timeout] y [-W waittime] para que pueda hacer:

ping -c 1 -t 1 -W 1 google.com
Ivelin
fuente