Linux Ping: Mostrar tiempo de espera

14

¿Cómo puedo hacer que el ping de Linux muestre el tiempo de espera de las solicitudes en lugar de omitir la salida?

Al igual que la versión de ping de Windows.

Andre
fuente
Cómo no mostrar el tiempo de espera?
Michael

Respuestas:

11

fping no me funcionó ... En mi caso, la mayoría del tiempo que quiero ver esto es básicamente durante el reinicio del servidor ... esto funciona bastante bien en Windows ...

Construyo un script simple (expandiendo la respuesta de @entropo) para ayudarme en eso, lo que puede ayudar a responder esta pregunta:

https://gist.github.com/brunobraga/7259197

#!/bin/bash

host=$1

if [ -z $host ]; then
    echo "Usage: `basename $0` [HOST]"
    exit 1
fi

while :; do
    result=`ping -W 1 -c 1 $host | grep 'bytes from '`
    if [ $? -gt 0 ]; then
        echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;31mdown\033[0m"
    else
         echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;32mok\033[0m -`echo $result | cut -d ':' -f 2`"
        sleep 1 # avoid ping rain
    fi
done

Y el uso es algo como:

enter image description here

bruno.braga
fuente
¿Puede modificarlo para informar el porcentaje de pérdida de paquetes y contar en cada línea?
Pol Hallen
13

Lo mejor que encontré fue usar el indicador -O (tenga en cuenta que no funciona en todas las distribuciones, usando Linux Mint 17.1 Rebecca IPUTILS-PING 3: 20121221-4ubuntu1.1)

$ ping -O 10.10.5.1

64 bytes from 10.10.5.1: icmp_seq=53 ttl=245 time=460 ms
no answer yet for icmp_seq=54
64 bytes from 10.10.5.1: icmp_seq=55 ttl=245 time=265 ms
64 bytes from 10.10.5.1: icmp_seq=56 ttl=245 time=480 ms
no answer yet for icmp_seq=57
64 bytes from 10.10.5.1: icmp_seq=58 ttl=245 time=348 ms
64 bytes from 10.10.5.1: icmp_seq=59 ttl=245 time=515 ms
no answer yet for icmp_seq=60
64 bytes from 10.10.5.1: icmp_seq=61 ttl=245 time=320 ms
64 bytes from 10.10.5.1: icmp_seq=62 ttl=245 time=537 ms

De la página del manual:

-O Report outstanding ICMP ECHO reply before sending next packet. This is useful together with the timestamp -D to log output to a diagnostic file and search for missing answers.

scoy
fuente
Hola scoy, bienvenido a Superusuario y gracias por la respuesta a esta pregunta. Esto parece depender de la versión de ping; en Debian Wheezy me sale " ping: invalid option -- 'O' ", pero en Jessie funciona como lo anotó. Tal vez desee actualizar su respuesta para incluir esta información. (También he enviado una edición sugerida para usar texto preformateado para la salida y la información de la página del manual)
bertieb
5

Cuando uso ping para ver si un host está arriba en los scripts de shell, hago algo como esto:

ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up

Básicamente, envía un ICMP que se agota en un segundo sin salida y usa el código de salida para bloquear la acción.

entropo
fuente
2

No hay camino para lo común. ping Para hacer eso. Si está intentando escribir algo, tiene algunas opciones:

ping -c 2 <ip>
RESULT=$?
echo $RESULT
1

Si el ping falla, $? será 1, si el ping es exitoso, $? será 0.

La otra opción es usar fping Eso funciona mucho como Cisco ping:

$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive

fuente
2

El script anterior de bruno.braga funciona bien, sin embargo, personalmente prefiero usar un alias en un perfil de shell (como .bashrc) para que pueda ser un caso de uso diario.

Mi solución a continuación también calcula automáticamente el número de secuencia de solicitud de ECHO:

alias pingt='__pingt() { s=0; while :; do s=$(($s+1)); result=$(ping $1 -c1 -W1 |/bin/grep from) && echo "$result, seq=$s" && sleep 1 || echo timeout; done }; __pingt $1'

Aquí está el ejemplo de salida cuando el host es inestable con un tiempo de espera:

$ pingt 10.10.10.126
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.235 ms, seq=1
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.228 ms, seq=2
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.209 ms, seq=3
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.241 ms, seq=4
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.195 ms, seq=5
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.211 ms, seq=6
timeout
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.267 ms, seq=8
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.232 ms, seq=9
^C

Por supuesto, el inconveniente es que no hay estadísticas al final cuando se presiona CTRL-C. Si lo desea, también sería posible calcular min / avg / max mediante shell script, mdev está muy lejos del alcance.

Jackie Yeh
fuente
1

Tengo miedo pero no hay una solución al 100% con el ping estándar. Incluso con ping -v para una salida detallada, el ping sería silencioso en caso de tiempos de espera. Podrías intentar usar:

ping -w 2 192.168.199.1
PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data.

--- 192.168.199.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms

Esto dejaría de hacer ping después de 2 segundos y luego mostraría la cantidad de paquetes transmitidos y la pérdida de paquetes. Otra opción sería utilizar mtr .


fuente
1
nomad@local:~$ fping -l -e 8.8.8.8

8.8.8.8 : [0], 92 bytes, 183 ms (183 avg, 0% loss)
8.8.8.8 : [1], 92 bytes, 61.4 ms (122 avg, 0% loss)
8.8.8.8 : [2], 92 bytes, 164 ms (136 avg, 0% loss)
8.8.8.8 : [3], 92 bytes, 163 ms (143 avg, 0% loss)
8.8.8.8 : [5], 92 bytes, 158 ms (146 avg, 16% loss)
8.8.8.8 : [6], 92 bytes, 122 ms (142 avg, 14% loss)
8.8.8.8 : [7], 92 bytes, 134 ms (141 avg, 12% loss)
8.8.8.8 : [8], 92 bytes, 130 ms (140 avg, 11% loss)

nomad@local:~$ fping -version
fping: Version 3.2
fping: comments to [email protected]
nvluan
fuente
Sin embargo, tenga en cuenta que después de que el fping se ejecute durante un par de minutos, los tiempos de espera esporádicos tienen un efecto nulo en la pérdida impresa (1 paquete de cada 1000 es una pérdida del 0,1% y el fping seguirá imprimiendo 0%). Sin mencionar que es mucho más fácil notar un "tiempo de espera de solicitud" que aprovechar el tiempo en que el 18% se convierte en el 19% (sin mencionar que debe ignorar el momento en que el 18% retrocede al 17%)
ndemou
fping es bueno, y por cierto el -e no es necesario cuando -l o -c se agrega, solo se puede usar fping -l 8.8.8.8, la salida es la misma.
Eric Wang
0

Me gusta mucho el script de shell de Bruno. Agregué una línea para crear un archivo con todos los fallos.

eco -e " date +'%Y/%m/%d %H:%M:%S' - host $ host es \ 033 [0; 31mdown \ 033 [0m "& gt; & gt; ./lostpackets.txt

Dave Honsvick
fuente
0

Sin scripting nada

ping -f -i 1 hostname

Ventajas : comando estándar de Linux - no hay que instalar ni script.

Desventajas :

  1. NADA se imprime para los paquetes que se contestan con éxito
  2. Hace un pitido molesto para los paquetes que son contestados con éxito
  3. La indicación visual de los tiempos de espera es la mínima posible (un pequeño punto permanece en la pantalla cuando se agota el tiempo de espera de un paquete).

Con un guión mínimo.

#!/bin/bash
while :; do
    ping -W1 -c 1 "$@" | grep 'bytes from '
    case $? in
        0 ) sleep 1 ;;
        1 ) echo -e "request timeout" ;;
        * ) exit ;;
    esac
done

Desventajas : No obtienes estadísticas al final y no puedes usar estas 3 opciones de ping:

  1. -i para alterar el intervalo entre el envío de paquetes (está codificado a 1 seg)
  2. -W para alterar el tiempo de espera (está codificado a 1 seg)
  3. -c parar después de enviar paquetes N

Por cierto: este es uno de los ejemplos extremadamente raros de funcionalidad que realmente extraño en una herramienta CLI de Linux, pero que encuentro en una herramienta de Windows. La exección que prueba la regla como dicen :-)

ndemou
fuente
0

Si desea realizar un ping continuo como Windows y con marca de tiempo, utilice este. Siéntase libre de reemplazar 192.168.0.1 con su propia dirección IP

while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done

Ejemplo de respuesta OK

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:49 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:50 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:51 GMT 2018 >>> Reply OK
^Z
[23]+  Stopped                 sleep 1
[user@Linux ~]$

Ejemplo de solicitud agotada

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.254 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:36 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:37 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:38 GMT 2018 >>> Request timed out
^Z
[22]+  Stopped                 ping -c 1 -t 1 192.168.0.254 >/dev/null
[user@Linux ~]$ 
Sabrina
fuente
0

El ping normal realmente te muestra los tiempos de espera. Al observar el valor seq = entre pings, puedes decir cuántos tiempos de espera

64 bytes from 192.168.12.46: icmp_seq=8 ttl=62 time=46.7 ms
64 bytes from 192.168.12.46: icmp_seq=11 ttl=62 time=45.3 ms

EG 3 tiempos de espera ocurrieron entre los 2 pings anteriores desde que el primero fue seq=8 y el segundo fue seq=11 (9 y 10 fueron tiempos muertos) seq=sequence.

Clive Gerada
fuente