Ich habe einen Access Point, der von Zeit zu Zeit ausfällt. Manchmal fällt er ein paar Mal am Tag aus, manchmal funktioniert er tagelang ohne Probleme. Mal muss ich ihn von Hand neu starten, mal läuft er nach einiger Zeit wieder von alleine an. Leider löscht er dabei immer sein Logfile, vielleicht um die Spuren seines Versagens zu vernichten.
Um die Zeitpunkte und die Dauer einer solchen Phase zu überwachen, entschied ich mich, einen Raspberry Pi in meinem Netzwerk einzusetzen um den AP anzupingen und die Ergebnisse in einem Logfile zu speichern.
Der einfache Ping zu einem Rechner im internen Netz und im Internet ist mir zwar bekannt, aber da ich den AP nicht mit endlosen Pings belasten wollte und für andere notwendigen Dinge brauchte ich Rat. Das hätte ich zwar alles ergoogeln können, aber heute gibt es ja auch ChatGPT, das beim Programmieren hilft. Also habe ich mich auf diesen Pfad begeben.
Interessanterweise musste ich mich erst langsam herantasten und am Ende war es eine interaktive „gemeinsame” Entwicklung von Ideen und deren Umsetzung. Ein paar Tage nachdem ich diese Übung gemacht hatte, schickte mir ein Kollege folgenden Link und hier beschreibt Don Norman exakt was ich bei der Erstellung dieses kleinen Skriptes auch durchgemacht habe. Ralf Stockmann beschreibt in seinem Blog „Erfahrungsbericht: Softwareentwicklung mit ChatGPT4 — die Mastowall” ein etwas komplexeres Projekt, ist auch sehr lesenwert.
Mein Prozess startete mit einer einfachen Frage: :
„Wie sieht ein ping Aufruf aus, in dem alle 1 minute ein ping abgesetzt wird”
ich
Das Ergebnis war nicht optimal, aber es war zumindest ein erster Schritt.
Um einen Ping-Befehl auszuführen, der alle 1 Minute ausgeführt wird, können Sie einen sogenannten „ping ‑t” Befehl verwenden, der den Ping-Befehl ununterbrochen ausführt, bis Sie ihn manuell beenden. Um jedoch sicherzustellen, dass der Ping-Befehl alle 1 Minute ausgeführt wird, können Sie eine einfache Schleife in einer Batch-Datei oder einem Skript einrichten, das den Befehl ausführt, eine Minute wartet und dann erneut ausführt.
In Windows könnte das Skript in etwa so aussehen:
@echo off :loop ping <Zieladresse> timeout /t 60 goto :loop
In diesem Beispiel wird der Befehl „ping ” einmal pro Minute ausgeführt, indem die Schleife wiederholt wird. „timeout /t 60” bewirkt, dass das Skript für 60 Sekunden pausiert, bevor es zur nächsten Iteration der Schleife zurückkehrt.
In Unix/Linux könnte ein ähnliches Skript wie folgt aussehen:#!/bin/bash while true do ping <Zieladresse> sleep 60 done
Dieses Skript führt den Befehl „ping ” einmal pro Minute aus, indem es in einer Schleife ausgeführt wird. „sleep 60” bewirkt, dass das Skript für 60 Sekunden pausiert, bevor es zur nächsten Iteration der Schleife zurückkehrt. Beachten Sie, dass in beiden Skripten „” durch die IP-Adresse oder den Hostnamen des Ziels ersetzt werden sollte, den Sie ping-en möchten.
ChatGPT
Das war natürlich keine Lösung für mich, ein Skript, dass ich in einer aktiven Session laufen lassen muss, aber da mir Cron nicht ganz unbekannt war, wusste ich, dass für die regelmäßige Ausführung von Befehlen eben dieser „Scheduling Service” verwendet werden kann. Also spezifizierte ich die Anfrage dahingehend um und forderte ChatGPT auf a) einen Cron-Eintrag definieren kann, der einmal pro Minute das Shell-Skript aufruft und dieses dann auch noch das Ergebnis in eine Log-Datei schreibt, da ich ja keine Terminal-Session mehr aktiv habe.
Zusammen mit einigen Erklärungen, z.B. wie man den Cron-Editor aufruft, habe ich folgenden Code für den Cron-Eintrag erhalten, das das Skript einmal die Minute aufruft:
* * * * * /pfad/zum/skript.sh
Da dann der Ping auch nur exakt einmal pro Minute ausgelöst werden soll, wurde von ChatGPT die Option „-c 1” hinzugefügt.
#!/bin/bash
while true
do
ping -c 1 <Zieladresse> >> /pfad/zur/ausgabedatei.log
sleep 60
done
Da nun aber der Sleep-Befehl nicht mehr benötigt wird, wurde dieser dann auch entfernt, allerdings erst auf Nachfrage.
Nach einigen weiteren Iterationen kam dann folgender Aufruf heraus, der nun auch kein Skript mehr aufruft, sondern den alles in einer Cron-Definition abwickelt. Zusätzlich wird bei jedem Ping auch der Status in die Logdatei geschrieben.
* * * * * echo "$(date) - Pinging <Zieladresse>" >> /pfad/zur/ausgabedatei.log && if ping -c 1 <Zieladresse> | grep -q "1 received"; then echo "Erfolgreich übertragen" >> /pfad/zur/ausgabedatei.log; else echo "Übertragung fehlgeschlagen" >> /pfad/zur/ausgabedatei.log; fi && echo >> /pfad/zur/ausgabedatei.log
Das funktionierte ganz gut, aber es war nicht sehr übersichtlich. Außerdem fehlte noch die Benachrichtigung per Mail, falls der AP nicht erreichbar ist.
Um dazu eine Lösung zu finden startete ich eine weitere Session mit ChatGPT, diesmal mit dem zusätzlichen Prompt, dass ChatGPT ein Linux Cron-Job Programmierer ist.
Als Dank bekam ich zunächst eine ausführliche Cron Einweisung.
Der erste Vorschlag für einen entsprechenden Cron-Aufrufes war dann auch viel besser, entweder wegen des Prompts oder weil ich die Frage besser gestellt habe:
You want to ping another computer every minute with exactly one ping. If that ping failed you want to write this with a time stamp into a log file. How will that line look like for crontab
Ich
Als Antwort gab es dann dieses Script:
* * * * * echo "$(date) - Pinging <Zieladresse>" >> /pfad/zur/ausgabedatei.log && if ping -c 1 <Zieladresse> | grep -q "1 received"; then echo "Erfolgreich übertragen" >> /pfad/zur/ausgabedatei.log; else echo "Übertragung fehlgeschlagen" >> /pfad/zur/ausgabedatei.log; fi && echo >> /pfad/zur/ausgabedatei.log
Die Frage nach der Benachrichtigung wurde mit diesem Cron Eintrag beantwortet, wobei ich nur bei einem Statuswechsel benachrichtig werden will:
* * * * * ping -c 1 -W 1 <IP_address> >/dev/null && ([ -f /tmp/ping_status ] && grep -Fxq "success" /tmp/ping_status) || (echo "success" > /tmp/ping_status && echo "$(date) - Ping successful" | mail -s "Ping Status Change" your_email@example.com) || (echo "failure" > /tmp/ping_status && echo "$(date) - Ping failed" | mail -s "Ping Status Change" your_email@example.com)
Sowie der folgenden Erklärung:
Hier ist eine Erläuterung der Änderungen:
([ -f /tmp/ping_status ] && grep -Fxq "success" /tmp/ping_status)
: Diese Bedingung prüft, ob die Datei/tmp/ping_status
existiert und ob der vorherige Ping erfolgreich war. Dadurch wird überprüft, ob sich der Status geändert hat.echo "success" > /tmp/ping_status
: Wenn der Ping erfolgreich ist und der vorherige Status nicht „success” ist, wird „success” in die Datei/tmp/ping_status
geschrieben.echo "$(date) - Ping successful" | mail -s "Ping Status Change" your_email@example.com
: Wenn der Ping erfolgreich ist und der vorherige Status nicht „success” war, wird eine E‑Mail-Benachrichtigung mit dem aktuellen Zeitstempel und der Nachricht „Ping successful” anyour_email@example.com
gesendet.echo "failure" > /tmp/ping_status
: Wenn der Ping fehlschlägt und der vorherige Status nicht „failure” ist, wird „failure” in die Datei/tmp/ping_status
geschrieben.echo "$(date) - Ping failed" | mail -s "Ping Status Change" your_email@example.com
: Wenn der Ping fehlschlägt und der vorherige Status nicht „failure” war, wird eine E‑Mail-Benachrichtigung mit dem aktuellen Zeitstempel und der Nachricht „Ping failed” anyour_email@example.com
gesendet.Stellen Sie sicher, dass Sie
your_email@example.com
durch Ihre eigene E‑Mail-Adresse ersetzen. Außerdem wird der Status in der Datei/tmp/ping_status
gespeichert. Sie können den Pfad zu dieser Datei nach Bedarf ändern.Mit dieser aktualisierten Version des Cron-Jobs erhalten Sie eine Benachrichtigung per E‑Mail, wenn der Ping-Status von erfolgreich auf fehlgeschlagen wechselt und umgekehrt.
ChatGPT
Da ich schon bei meinem ersten Ansatz gemerkt habe, dass es vielleicht besser ist, einen so komplexen Befehl nicht in die cron-Datei zu schreiben, deshalb gab es dann auch noch die Anweisung, den Wust in ein Shell-Skript auszulagern und habe dann folgendes Bash-Skript erhalten:
#!/bin/bash
if ping -c 1 -W 1 <IP_address> >/dev/null; then
if ! ([ -f /tmp/ping_status ] && grep -Fxq "success" /tmp/ping_status); then
echo "success" > /tmp/ping_status
echo "$(date) - Ping successful" | /usr/bin/mail -s "Ping Status Change" your_email@example.com
fi
else
if ! ([ -f /tmp/ping_status ] && grep -Fxq "failure" /tmp/ping_status); then
echo "failure" > /tmp/ping_status
echo "$(date) - Ping failed" | /usr/bin/mail -s "Ping Status Change" your_email@example.com
fi
fi
Das läuft jetzt seit ein paar Tagen bei mir, aber der AP spielt im Moment auch nicht verrückt, so dass ich recht keine Mails vom Skript bekomme. Ich habe es aber mit einem Gerät getestet, dass ich einfach vom Netz nehmen kann.
Damit die Mails in der Kommandozeile verschickt werden können, musste ich meinen Raspi mit meinem Mailprovider sprechen lassen, was ich hier beschrieben habe.
Verbesserungen, Kritik oder sonstige Anmerkungen gerne in die Kommentare.
Schreibe einen Kommentar