weidner/archives/2023/02/

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.

Posted 2023-02-15
Tags: