Nur "lange Pings" ausgeben / Verbindungsabbrüche protokollieren

Nur "lange Pings" ausgeben / Verbindungsabbrüche protokollieren

Ich habe eine Verbindung, die manchmal für eine Weile unterbrochen wird, und ich versuche, genau zu bestimmen, wann ich verwende. pingDadurch wird eine Ausgabe wie die folgende erzeugt:

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

Wie kann ich?

  • Geben Sie nur die Zeilen mit einem großen aus time. Ist grepdas möglich?
  • Fügen Sie ihnen einen Zeitstempel hinzu (ich kenne die -DOption von ping, aber ich bevorzuge einen für Menschen lesbaren Stempel)

Antwort1

grepDiese Lösung wurde mit und awk( ausgearbeitet .von dieser Frage gerissen, vielleicht übertrieben, aber es funktioniert)

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

Antwort2

Apropos Overkill-Lösungen: Wenn Sie dennoch eine Antwort auf Ihre erste Frage möchten (nur Zeilen mit einer Zeit größer als X erhalten), versuchen Sie es mit dem folgenden hässlichen Bash-Python-Hybridskript:

#!/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}"

Wenn Sie das beispielsweise in eine Skriptdatei einfügen, test.shkönnen Sie ihr zwei Parameter übergeben: den Hostnamen, den Sie anpingen möchten, und die minimale TTL, unter der die Ping-Ausgabe nicht wiederholt werden soll. Wenn Sie beispielsweise ausführen, tst.sh www.google.com 100werden nur Pings an www.google.com zurückgegeben, die länger als 100 ms dauern.

Antwort3

Mir gefällt die Idee nicht, für solche Dinge Text zu verarbeiten, obwohl das unixtypisch ist. Sie könnten sich Perl & Net::Ping ansehen. Damit können Sie Ihr eigenes Timeout definieren und nur dann Maßnahmen ergreifen, wenn der Ping fehlschlägt. Mehr hier:

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

verwandte Informationen