Skripte einfach überwachen per Cronjob

Skriptausschnitt

Skriptausschnitt

Wer unter Linux bereits ein eigenes Shell-Skript geschrieben hat weiß, dass es oft gut ist diese zu überwachen. Insbesondere bei den ersten Ausführungen möchte man wissen, ob das Skript ordnungsgemäß arbeitet oder ob es an einigen Stellen zu Fehlern kommt. Hierfür kann man die Ausgabe des Skripts in eine Textdatei umleiten und diese per Email an den Serveradministrator oder an eine Gruppe von Personen schicken. Sollten dann Fehler auftreten, kann man darauf schnell reagieren.

Um das zu ermöglichen, sammelt man die Ausgaben und lässt sie über einen Cronjob verschicken. Somit kommt nicht nach jedem Cronjob eine Benachrichtigung, sondern erst zu einem festgelegten Zeitpunkt. Das möchte ich in diesem Artikel genauer erklären.

Der Unterschied zum herkömmlichen Versenden von Benachrichtigungen besteht darin, dass Skripte sonst nur ihre Fehler melden. Im Erfolgsfall erhält man keine Ausgabe. Doch manchmal ist es durchaus nützlich, wenn ein Skript auch im Erfolgsfall eine Rückmeldung liefert. Beispielsweise die Ausgaben, die man per echo definiert hat.

Was man hierfür benötigt

Neben der Plattform, auf der man diese Skripte ausführen möchte, benötigt man noch ein ganz wichtiges Paket. Dieses Paket ist die Schnittstelle vom lokalen Gerät (meist einem Server) und einem Emailprovider, über den wir die Emails versenden wollen. In meinem Beispiel verwende ich das Paket ssmtp in Verbindung mit einer Emailadresse bei Google.

ssmtp ist ein kleines Softwarepaket für Linux, welches uns das Versenden von Emails direkt in der Konsole erlaubt, ohne dass wir hierfür einen Mailserver installieren müssen. Gerade im privaten Bereich ist die Einrichtung eines Mailservers meiner Meinung nach nicht zu empfehlen, wenn man diesen nicht wirklich in seinem Umfang benötigt. Mailserver sind komplex zu verwalten und lassen sich bei falscher Konfiguration für kriminelle Zwecke nutzen. Dieses Risiko muss man nicht unbedingt eingehen. ssmtp gestattet nur das Senden von Emails, weshalb der große Administrationsaufwand hier ausbleibt.

Das Paket lässt sich mit einem herkömmlichen Emailprovider wie Google betreiben, kann aber auch dazu genutzt werden um über seine eigene Emaildomain die virtuellen Briefe zu verschicken.

Außer diesem Paket benötigt man desweiteren noch ein wenig Zeit und Interesse, sich mit der Materie auseinander zu setzen.

Wie man vorgeht

Mein erster Schritt war es, einen Ordner zu erstellen, in den ich all die Ausgaben meiner Skripte oder Cronjobs leite. Nach jeder Ausführung sollte hier eine Datei liegen, sofern es Fehler gab. Bei eigenen Skripten, die per Cronjob ausgeführt werden, kann man auch bei einer positiven Ausführung Rückmeldung geben lassen. Der Ordner ist also eine Sammelstelle für alle Ausgaben, welche wir mit einem Skript weiterverarbeiten werden.

Jetzt mehr erfahren:  Raspberry Pi als Temperaturmessstation

Dieser Ordner benötigt selbstverständlich auch die richtigen Berechtigungen. Man muss hier also darauf achten, welcher Benutzer später die Cronjobs ausführt – in meinem Fall der Benutzer root – und ob dieser Benutzer die Berechtigung zum Schreiben auf den Ordner hat. Wäre dies nicht der Fall, könnten keine Ausgaben erzeugt und abgelegt werden. Da der Benutzer root generell im Dateisystem Schreib- und Leseberechtigungen hat, muss ich hier auf nichts weiter achten.

Das Skript

Kommen wir zum Herzstück des Ganzen.

# Enter the folder you want to check for files
folder="/home/pi/protocols/"
# Enter the recipients
recipients="abc@example.com, bcd@example.com"
# The script will do the rest for you
echo "$folder will be checked for new files ..."
if [ "$(find $folder -type f)" ]; then
files=$(find $folder -type f)
echo "Files were found"
for line in $files; do
echo $line
mail -s "Dircheck $folder" -t $recipients < $line
rm $line
done
else
echo "No files found"
fi
# If folder contains files every file will be send as textmessage 
# to all the recipients in the list 
# Just save files from e.g. cronjobs you want to monitor 
# After sending files to the recipients, the files will be removed 
# from your harddisk

Da das Skript schon an sich recht selbsterklärend ist, muss man eigentlich nicht viel dazu sagen. In der Variablen folder wird der Pfad zum Ordner gespeichert, welcher alle Protkolldateien enthalten soll. Im Normalfall speichert man Protokolle im Linux-Dateisystem unter /var/log. Zu Testzwecken, habe ich diesen Ordner jedoch in den Homedirectory des Users Pi ausgelagert.

Die Variable recipients enthält alle Emailadressen der Personen, welche die Email erhalten sollen. Da ssmtp auch mehrere Emailadressen entgegen nimmt, konnte ich hier zwei Emailadressen eintragen. Da diese Adressen später in das Adressatenfeld An eingetragen werden, können die Empfänger sich untereinander sehen. Wer das so nicht wünscht, kann die anderen Adressaten in ein anderes Feld eintragen.

Im nächsten Schritt beginnt das Skript die eigentliche Arbeit. Es gibt aus, welcher Ordner auf neue Protokolldateien gecheckt wird und springt in die erste If-Anweisung. Hier wird überprüft, ob der Ordner Dateien enthält oder nicht. Sollte der Ordner Dateien enthalten, werden die Textdateien ausgelesen und jede Textdatei wird einzeln in eine Email gepackt. Der Text, welcher in der Textdatei steht, wandert in den Body der Email. Somit verschickt das Skript keine Anhänge. Nach dem Senden einer Email wird die Protokolldatei vom Filesystem gelöscht, so dass dieses nicht unnötig belastet wird. Diesen Schritt könnte man manuell machen, sofern man das wünscht.

Jetzt mehr erfahren:  Raspberry Pi Backup - Vollautomatisch sichern

Sollte ein Ordner keiner Dateien enthalten, ist die Anweisung direkt vorbei und der Cronjob ist beendet.

In der Cron-Tabelle

Auszug aus der Crontabelle

Auszug aus der Crontabelle

Damit die Cronjobs ihre Ausgaben auch in Dateien umleiten, muss man dies explizit angeben. Das geschieht, indem man am Schluss – wie im Bild – folgendes anhängt:

> /home/pi/protocols/protocol.txt

In diesem Fall wird die Ausgabe in die Datei protocol.txt umgeleitet, welche im Verzeichnis /home/pi/protocols gespeichert wird. Wichtig ist, dass man auch das > Zeichen angibt.

Fazit

Im Hobbybereich ist man oft darauf angewiesen, dass man sich Dinge möglichst einfach macht. Man hat nicht immer die Zeit, sich so intensiv mit Dingen auseinanderzusetzen wie man es gerne würde. Aus diesem Grund ist es hilfreich, wenn man sich die Verwaltung seines Servers möglichst einfach macht. Dieses Skript soll ein Schritt in diese Richtung sein. Ich habe es mit dem Gedanken geschrieben, Bereiche des Smart Home auf dem Raspberry Pi nächtlich neu zu starten. Nach einem Umzug auf eine neue SD-Karte kamen hier öfter Probleme auf und mir war es wichtig, jede Ausgabe des Skripts nachlesen zu können. Da ich jedoch bedingt durch die Arbeit nicht jeden Tag nachsehen konnte, musste der Server mir die Informationen direkt aufs Handy schicken.

Zum Schonen des Speicherplatzes war es mir zudem wichtig, dass die Protokolldateien direkt nach dem Versenden wieder gelöscht werden, denn ich habe diese ja dann im Postfach.

Da dieses Skript sehr einfach gehalten ist, kann man es nach Belieben anpassen oder erweitern. Ebenso kann es ein guter Einstieg in das Skripting unter Linux sein, da es bereits viele wichtige Dinge enthält: Variablen und Anweisungen.

Inzwischen laufen alle Skripte wieder rund, weshalb ich die Protokollierung und dieses Skript in den Cronjobs wieder deaktiviert habe. Sollte es jedoch erneut wichtig sein, dass ich die Ausgaben im Blick behalten muss, kann ich dieses jederzeit schnell wieder aktivieren.

Was ich grundsätzlich noch anmerken möchte ist, dass die Cronjobs generell immer eine Ausgabe per Email senden. Jedoch empfinde ich persönlich es als störend, wenn am Tag mehrere Emails kommen. Ich möchte diese Ausgaben zuerst sammeln und dann zu einem fixen Zeitpunkt senden. Eine Feinheit, die man an diesem Skript noch ändern müsste wäre, dass nicht für jede Datei eine einzelne Email verschickt wird, sondern dass diese in einer Email zusammengefasst werden. Da bin ich jedoch aktuell noch nicht dazu gekommen. Eventuell werde ich das noch ändern.

Kategorien: Computer und Digitales

Lukas

Hey, ich bin Lukas. Seit einigen Jahren schreibe ich in meinem Smart Home Blog über Hausautomation und Digitalisierung. Als Wirtschaftsinformatiker weiß ich, wie wichtig die Vernetzung von IT-Systemen ist. Diese Erkenntnisse übertrage ich auf mein eigenes Smart Home, das ich auf Basis von ioBroker betreibe. Hierzu nutze ich die Leistung meines eigenen Server-Clusters aus dem Keller. In deinen Ohren klingt das mindestens genauso spannend, wie für mich? Dann komm mit auf unsere Reise zu einem vollwertigen, sicheren und komfortablen Smart Home. Ganz oben findest du Verknüpfungen zu Social Media, wo du mir gerne folgen darfst. Ich freue mich auf dich!

0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.