Saída apenas "pings longos" / Interrupções de conexão de log

1

Estou em uma conexão que às vezes é interrompida por algum tempo e estou tentando determinar exatamente quando uso ping , que gera uma saída assim:

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

Como posso?

  • Produza apenas as linhas com um grande time . Pode grep fazer isso?
  • Adicione um timestamp a eles (eu sei sobre a opção -D de ping , mas eu prefiro um carimbo legível)
por Bart van Heukelom 29.05.2012 / 22:37

3 respostas

1

Desenvolvi essa solução com grep e awk ( extraídos desta questão , talvez exagerem, mas 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(); }'
    
por 29.05.2012 / 22:52
1

Falando em soluções de overkill, se você ainda quiser uma resposta para sua primeira pergunta (apenas obtenha linhas com um tempo maior que X), tente o seguinte 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}"

Se você colocar isso em um arquivo de script, diga test.sh , você pode passar dois parâmetros: o nome do host que você deseja fazer o ping, e o TTL mínimo, abaixo do qual não deve ecoar a saída do ping. Por exemplo, se você executar tst.sh www.google.com 100 , só retornará pings para www.google.com que demorem mais de 100 ms.

    
por 29.05.2012 / 23:10
0

Eu não gosto da ideia de processar texto para esse tipo de coisa, embora seja a coisa unix-y a fazer. Você pode olhar para perl & Net :: Ping Com ele, você pode definir seu próprio tempo limite e agir somente quando o ping falhar. Mais aqui:

link

    
por 29.05.2012 / 23:09