Kontrolliertes Ping
Ein dauerhaftes Ping wird gern verwendet, um flüchtige Fehler einzugrenzen. Jede Sekunde kommt eine Meldung, ob die Verbindung noch funktioniert oder gerade unterbrochen ist.
Ein Problem dabei ist jedoch, dass ich die Ping-Ausgabe ständig im Blick haben muss, um bei einem Ausfall sofort zu reagieren. Das ist zum einen lästig, weil ich meine Aufmerksamkeit teilen muss und andere Sachen nur nebenbei machen kann. Zum anderen kann ich bei lang andauernden Untersuchungen nicht mal eben einen Tag oder eine Woche auf das Ping aufpassen.
Das Monitoring verwendet meist zu große Zeitraster, so dass kurzzeitige Probleme dort oft unentdeckt bleiben.
Nun könnte ich relativ einfach
mit script
oder tee
die Ping-Ausgabe in eine Datei schreiben
und diese im Nachhinein untersuchen.
Dabei ergibt sich jedoch das Problem, dass es nicht einfach ist, in einer Datei mit Tausenden von Zeilen die fehlenden Ping-Antworten zu entdecken.
Habe ich die fehlenden Antworten dann endlich entdeckt, ist die Bestimmung der genauen Zeit problematisch, weil Ping zwar etwa einmal pro Sekunde sendet, sich über einen längeren Zeitraum dennoch eine Drift einstellt, die die Korrelation mit anderen Ereignissen erschwert.
Hier hilft mir ein kleines Skript,
dass einerseits in einer Endlosschleife
Ping mit einer begrenzten Anzahl von Versuchen laufen lässt
und andererseits vor jedem Aufruf von Ping die Systemzeit festhält.
Außerdem protokolliert das Skript mit tee
in eine Datei,
in der ich auch später nachschauen kann.
#!/bin/sh
ADDR=$1
OUT="supervised-ping-${ADDR}.txt"
while true; do
NOW=$(date '+%Y%m%dT%H%M%S')
echo "${NOW} - ping ${ADDR}" | tee -a -i "${OUT}"
ping -c 60 ${ADDR} | tee -a -i "${OUT}"
done
Im Skript wird ping
mit der Option -i 60
aufgerufen,
die das Programm veranlasst,
sich nach 60 Antworten zu beenden,
wobei es vorher eine Zusammenfassung ausgibt.
Das Programm tee
hingegen bekommt zwei Optionen mit.
Option -a
weist es an,
die Ausgabe an eine vorhandene Datei anzuhängen,
anstatt sie zu überschreiben.
Mit -i
ignoriert tee
Signale,
wodurch es lange genug weiterläuft,
um auch die letzte Zusammenfassung von ping
zu protokollieren,
wenn ich das Script mit Ctrl-C beende.
Die aktuelle Uhrzeit gibt das Skript sekundengenau an, gefolgt von den 60 PING-Versuchen. Der Zähler bei den Antworten muss nur noch zur Startzeit addiert werden, um die Zeit eines Ausfalls zu ermitteln. Aller 60 Sekunden gibt Ping eine Statuszeile aus, die es leicht macht, die Ausfälle in einem großen Zeitraum zu finden.
Das Skript rufe ich wie folgt auf:
$ ./supervised-ping 192.168.178.38
Die Ausgabe sieht dann etwa so aus:
20230209T192719 - ping 192.168.178.38
PING 192.168.178.38 (192.168.178.38) 56(84) bytes of data.
64 bytes from 192.168.178.38: icmp_seq=1 ttl=64 time=1114 ms
64 bytes from 192.168.178.38: icmp_seq=2 ttl=64 time=89.9 ms
64 bytes from 192.168.178.38: icmp_seq=3 ttl=64 time=105 ms
64 bytes from 192.168.178.38: icmp_seq=4 ttl=64 time=202 ms
64 bytes from 192.168.178.38: icmp_seq=5 ttl=64 time=47.9 ms
64 bytes from 192.168.178.38: icmp_seq=6 ttl=64 time=71.5 ms
64 bytes from 192.168.178.38: icmp_seq=7 ttl=64 time=90.7 ms
64 bytes from 192.168.178.38: icmp_seq=8 ttl=64 time=192 ms
64 bytes from 192.168.178.38: icmp_seq=9 ttl=64 time=6.64 ms
64 bytes from 192.168.178.38: icmp_seq=19 ttl=64 time=866 ms
64 bytes from 192.168.178.38: icmp_seq=20 ttl=64 time=3.39 ms
64 bytes from 192.168.178.38: icmp_seq=21 ttl=64 time=4.42 ms
64 bytes from 192.168.178.38: icmp_seq=22 ttl=64 time=35.4 ms
64 bytes from 192.168.178.38: icmp_seq=23 ttl=64 time=59.2 ms
64 bytes from 192.168.178.38: icmp_seq=24 ttl=64 time=7.82 ms
64 bytes from 192.168.178.38: icmp_seq=25 ttl=64 time=175 ms
^C
--- 192.168.178.38 ping statistics ---
25 packets transmitted, 16 received, 36% packet loss, time 24250ms
rtt min/avg/max/mdev = 3.386/191.994/1113.790/311.216 ms, pipe 2
Läuft die Auswertung über mehrere Tage,
kann ich die Protokolldateien einfach mit mv
umbenennen.
Nach spätestens einer Minute beendet tee
das Schreiben in die alte Datei
und beginnt eine neue.
Statt mit mv
die Dateien von Hand oder per Skript zu verschieben,
kann ich auch logrotate
verwenden
und die älteren Protokolle komprimieren.
Damit eignet sich das Skript
auch für die dauerhafte Überwachung von Verbindungen,
wobei die Anzahl der aufgehobenen Protokolle bestimmt,
wie weit ich bei Untersuchungen in die Vergangenheit gehen kann.