Longtime Ping mit Fehlerbericht unter Linux

Wenn man über längere Zeit eine IP Verbindung simpel überwachen will, eignet sich Ping sehr gut. Hier die Parameter für eine übersichtliche Ausgabe:

ping -O -D -q <hostname or ip>

Dabei gibt -O eine Rückmeldung, wenn keine Antwort vor dem nächsten Ping eingangen ist (sonst werden diese ja ignoriert) und -D stellt jeder Ausgabe den aktuellen Timestamp voran. Dann weiß man auch, wann ein Paket nicht durchgegangen ist. -q wiederum deaktiviert den restlichen Output.

Das resultiert dann z.B. in:

[1549362144.861791] no answer yet for icmp_seq=75

für jeden erfolglosen Ping.

Damit man das schönes lesen kann, kann man das noch mittels sed leserlicher machen:

ping -O -D -q <hostname or ip> | sed -r 's/\[(1[0-9]{9})(.*)\]/echo $(date -d @\1)":" /e'

und man erhält gut lesbar:

Die Feb 5 11:34:57 CET 2019: no answer yet for icmp_seq=271

Erweitert inklusive Log-Datei

Im Screen starten wir

host="<hostname or ip>";  date > ping-$host.log; ping -O -D -q $host 2>&1 | sed -u -r 's/\[(1[0-9]{9})(.*)\]/echo $(date -d @\1)":" /e' | tee -a ping-$host.log

und in einer zweiten Session rufen wir folgendes auf, um aktuelle infos zu erhalten:

host="<hostname or ip>"; pkill -3 -f ping.*-D.*$host; cat ping-$host.log

Abgesehen von Variablen und einem initialen Input in unser Logfile pipen wir jetzt den STDERR von ping auf STDOUT. Sed verwendet mittels -u den unbuffered mode und tee schreibt uns den output nicht nur auf die Konsole sondern auch in das Logfile.

Mittels pkill  suchen wir dann nach unserem Ping-Prozess. -f sucht dabei nach dem vollen Kommando (es könnten ja noch andere pings laufen) und -3 schickt ein SIGQUIT an Ping. Das bewirkt ein Ausgeben der Ping-Statistiken, ohne Ping zu beenden (ist auch mittels CTRL-\,CTRL-| oderCTRL-4 auf der Shell des Ping-Prozesses möglich - das beendet aber auch den sed Prozess und damit das gesamte Kommando - wir müssen daher mittels pkill das Signal direkt an ping schicken!).

Am Ende kann man per cat, less oder tail die Log-Datei anzeigen.