Lichter auf einer Wand über eine Station zum Be- und Entladen eines LKW.

Statusmails per Cronjob verschicken

Wer mein Blog schon etwas länger verfolgt oder sich mal durchgeklickt hat ist vielleicht darauf aufmerksam geworden, dass ich als Feedreader Tiny Tiiny RSS verwende. Bei diesem Feedreader hat man die Möglichkeit per Cronjob seine abonnierten Feeds aktualisieren zu lassen.

Der schlechte Ansatz

Anfangs dachte ich es wäre eine gute Idee die Ausgaben des auszuführenden Skriptes in einer Datei zu loggen. Nach einer Woche wurde mir jedoch klar, dass dies keine gute Idee war, da die Logdatei bereits zu diesem Zeitpunkt mehrere Megabyte groß geworden war. Zum schnellen Checken des Status also völlig unbrauchbar. Die logische Konsequenz daraus war, dass ich das Logging komplett entfernt habe, was im Nachhinein betrachtet auch keine allzu schlaue Lösung darstellt.

Die bessere Lösung

Vor ein paar Wochen kam mir dann die Idee die Ausgaben des Skriptes per Mail verschicken zu lassen. Ich fand nach einiger Recherche auch ein paar brauchbare Ansätze, die jedoch dadurch zunichte gemacht wurden, dass mir auf meinem Webspace die benötigten Erweiterungen nicht zur Verfügung stehen.

Heute bin ich dann schließlich doch auf eine Lösung gestoßen, die mein Problem behebt. Hier jetzt erst mal der Code, der im Shellskript steht, welches ich für die Ausführung verwende:

#!/bin/sh

cd /path/to/feedreader
php5 -f update_feeds.php > update_feeds.log
mailx -s "Feedreader Update Status" example@example.com < update_feeds.log
rm -f update_feeds.log

Was passiert jetzt in diesem Skript genau? Das ist im Grunde genommen so einfach wie genial.

Die erste Zeile zeichnet die Datei als Shellskript aus, damit Linux auch weiß, dass sie ausgeführt und nicht gelesen werden soll. Der Befehl cd dient dazu in ein anderes Verzeichnis zu springen. In diesem Fall der Ordner, in dem Tiny Tiny RSS installiert ist.

Als nächstes kommt der wichtige Teil dieses Skriptes, da mit dem Befehl php5 das Updateskript aufgerufen wird. php5 deswegen, da unter dem üblichen Befehl php auf meinem Webspace noch PHP 4 ausgeführt wird. Das war jedoch noch nicht alles, da mit dem Operator > die Ausgabe des Skriptes in einer Datei gespeichert wird. Verwendet man den Operator >> wird die Ausgabe an die bisherigen Inhalte der Datei angehängt, was bei mir, wie oben beschrieben, zu riesigen Dateien führen kann.

Soweit so gut, das ist bisher fast genau das, was ich anfangs auch genutzt habe. Doch jetzt kommt der entscheidende Unterschied. In der nächsten Zeile wird mit dem Befehl mailx eine eMail verschickt. Den Betreff kann man über den Parameter -s angeben. Anschließend folgt die Mailadresse, an die die Mail geschickt werden soll. Am Ende der Zeile wird durch den Operator < der Inhalt der zuvor geschriebenen Logdatei in den Body geschrieben. Das Ergebnis davon sieht man Sekunden danach in seiner Inbox. In der letzten Zeile lösche ich mit dem Befehl rm noch die Datei, damit kein unnötiger Speicherplatz verbraucht wird.

Alles in allem also keine große Magie, die dort betrieben wird. Man muss einfach nur die zur Verfügung stehenden Mittel seines Servers/Webspaces herausfinden und nutzen, was am besten passt.

Die abschließende Perfektion der Lösung

Bisher scheint die Lösung des Problems schon sehr gut zu sein, doch wenn der Cronjob alle fünf Minuten ausgeführt wird hat man bald ein extrem überfülltes Postfach. Deswegen zeige ich hier noch eine Möglichkeit auf diesen Umstand in Thunderbird zu beheben.

Fängt man an zu rechnen fällt sehr schnell auf, dass pro Tag 288 eMails im Postfach landen. Rechnet man weiter sind das 2016 eMails in der Woche und 105120 eMails im Jahr. Eindeutig zuviel um den Überblick zu behalten. Hier kommt dann allerdings ein sehr praktisches Feature von Thunderbird ins Spiel. Leitet man seine Statusmails über einen Filter in einen bestimmten Ordner, so kann man einfach in den Eigenschaften dieses Ordners einstellen, dass alle darin enthaltenen eMails, die älter als ein Tag sind gelöscht werden.

Dazu macht man einen Rechtsklick auf den Ordner und wählt „Eigenschaften“ aus. Im sich öffnenden Dialog wechselt man in den Reiter „Speicherplatz“. Dort befindet sich dann die gewünschte Einstellung. Es gibt natürlich auch noch andere Möglichkeiten, z.B. dass alle Nachrichten bis auf die letzten 30 oder alle gelesenen gelöscht werden. Das muss dann aber jeder für sich entscheiden.