Generar solo "pings largos" / Registrar interrupciones de conexión

Generar solo "pings largos" / Registrar interrupciones de conexión

Estoy en una conexión que a veces se interrumpe por un tiempo y estoy tratando de determinar exactamente cuándo usar ping, lo que genera un resultado como este:

64 bytes from 192.168.0.1: icmp_req=1196 ttl=64 time=4.64 ms
64 bytes from 192.168.0.1: icmp_req=1197 ttl=64 time=5.14 ms
64 bytes from 192.168.0.1: icmp_req=1198 ttl=64 time=4.90 ms
64 bytes from 192.168.0.1: icmp_req=1199 ttl=64 time=25293 ms < -- interruption
64 bytes from 192.168.0.1: icmp_req=1200 ttl=64 time=24286 ms      starts here
64 bytes from 192.168.0.1: icmp_req=1201 ttl=64 time=23278 ms
64 bytes from 192.168.0.1: icmp_req=1202 ttl=64 time=22270 ms
64 bytes from 192.168.0.1: icmp_req=1203 ttl=64 time=21262 ms
64 bytes from 192.168.0.1: icmp_req=1204 ttl=64 time=20254 ms
64 bytes from 192.168.0.1: icmp_req=1224 ttl=64 time=142 ms
64 bytes from 192.168.0.1: icmp_req=1225 ttl=64 time=4.87 ms
64 bytes from 192.168.0.1: icmp_req=1226 ttl=64 time=4.54 ms

¿Cómo puedo?

  • Genere solo aquellas líneas con un tamaño grande time. ¿Lo puede grephacer?
  • Agrégueles una marca de tiempo (conozco la -Dopción de ping, pero preferiría una marca legible por humanos)

Respuesta1

Resolvió esta solución con grepy awk(arrancado de esta pregunta, tal vez exagerado pero funciona)

ping 192.168.0.1 \
| grep -E "time=[0-9]{2}" --line-buffered \
| gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

Respuesta2

Hablando de soluciones excesivas, si aún desea una respuesta a su primera pregunta (solo obtenga líneas con un tiempo mayor que X), pruebe el siguiente script híbrido bash-python:

#!/bin/bash

IFS='\n' read -r -d '' check_ping <<EOF
from sys import stdin
data = reduce(lambda x, y: str(x) + str(y), stdin.readlines())
time = int(float(data.split("time=")[-1].split(" ")[0].strip()))
if time > $2: print(data)
EOF

ping -c 1 $1 | python -c "${check_ping}"

Si coloca eso en un archivo de script, digamos test.sh, puede pasarle dos parámetros: el nombre de host al que desea hacer ping y el TTL mínimo, por debajo del cual no debería hacer eco de la salida del ping. Por ejemplo, si lo ejecuta, tst.sh www.google.com 100solo devolverá pings a www.google.com que demoren más de 100 ms.

Respuesta3

No me gusta la idea de procesar texto para este tipo de cosas, aunque es lo que se puede hacer en Unix-y. Podrías mirar perl y Net::Ping. Con él puedes definir tu propio tiempo de espera y solo tomar medidas cuando falla el ping. Más aquí:

http://perldoc.perl.org/Net/Ping.html

información relacionada