HH maczarr.de

Wieso wird mein Script in /etc/cron.weekly/ nicht ausgeführt?

Seit letztem Frühjahr betreibe ich einen eigenen DNS-Server mittels "Unbound" bei mir im heimischen Netzwerk auf einem Raspberry Pi. Der funktioniert auch seitdem tadellos. Wöchentlich sollte er sich mit Hilfe eines Scripts eine aktuelle Host-Liste herunterladen und auch eine Liste aktueller Werbe-Server - denn neben dem auflösen von Hostnames zu IP-Adressen filtert mir der kleine Server auch so nebenbei Werbung auf allen Geräten im lokalen Netz raus ohne dass ich irgendwelche Ad-Blocker-Add-Ons in Browser installieren muss oder sonstwas. Dieses Aktualisierungsscript bot sich natürlich an automatisch als Cronjob ausgeführt zu werden indem ich es in /etc/cron.weekly/ ablegte. Jedoch hatte ich die letzten Monate nie kontrolliert, ob es auch ordentlich funktioniert. Ein Fehler.

Letztes Wochenende setze ich den Unbound-Server neu auf. Ich hatte zuvor meinen RasPi 2 für diese Aufgabe verwendet und wollte ihn nun für etwas anderes benutzen und stattdessen den Unbound-Server mit dem alten RasPi 1 betreiben, den ich noch rumfliegen hatte. Die Netzwerk-Schnittstelle ist bei allen RasPis seit dem Model B die selbe und ansonsten braucht der Unbound-Server auch nicht viele Ressourcen.

So kopierte ich jedenfalls mein Update-Script unbound_updates.sh vom alten auf den neu eingerichteten Unbound-Server und ebenso die vermeintlich aktuellen Host- und Werbe-Server-Listen. Zu meiner Verwunderung musste ich feststellen, dass diese Listen gar nicht so neu waren und anscheinend seit dem Einrichten nicht mehr aktualisiert worden waren. Ich wunderte mich. Von Hand ausgeführt legte das Script sofort los und tat genau wofür es programmiert war. Aber automatisch 1x pro Woche wurde es bisher augenscheinlich nicht ausgeführt.

Die Lösung: Kein Punkt ist besser als ein Punkt

Nach etwas Recherche fand ich heraus, dass die Lösung simpel war: Scripts in den /etc/cron.*/-Verzeichnissen (also cron.weekly, cron.monthly, cron.hourly und cron.daily) dürfen keinen Punkt im Dateinamen tragen, was durch die Dateiendung ".sh" natürlich gegeben war. Ein simples mv unbound_updates.sh unbound_updates entfernte den Punkt inklusive Dateiendung und seit dem wird das Script erfolgreich wöchentlich ausgeführt.

Ärgerlich an der Sache ist, dass es keinen Fehler gibt. Man bekommt schlicht nicht mit, dass das Script niemals ausgeführt wird, wenn man die Auswirkungen des Scripts nicht von Hand kontrolliert. Hintergrund ist, dass die Scripts in den /etc/cron-*/-Verzeichnissen vom Programm run-parts ausgeführt werden. Das Programm nimmt als Parameter ein Verzeichnis entgegen und führt dann alle ausführbaren Dateien darin aus, die dem von run-parts definierten Schema entsprechen. Laut der Doku "müssen die Namen komplett aus ASCII-Groß- und -Kleinbuchstaben, ASCII-Ziffern, ASCII-Unterstrichen und ASCII-Minuszeichen bestehen". Was fällt auf? Richtig: Punkte sind nicht erlaubt.