Ich habe eine Verbindung, die manchmal für eine Weile unterbrochen wird, und ich versuche, genau zu bestimmen, wann ich verwende. ping
Dadurch 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
. Istgrep
das möglich? - Fügen Sie ihnen einen Zeitstempel hinzu (ich kenne die
-D
Option vonping
, aber ich bevorzuge einen für Menschen lesbaren Stempel)
Antwort1
grep
Diese 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.sh
kö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 100
werden 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: