Crontab ohne Dauerbetrieb

Unix-Systeme einschließlich Linux verfügen über einen Mechanismus, der Programme automatisch zu bestimmten Zeiten ausführen kann – etwa täglich zu einer gewissen Uhrzeit oder wöchentlich oder monatlich an einem bestimmten Tag und hier wiederum zu einer festgelegten Uhrzeit. Gesteuert wird das Ganze über eine Datei namens crontab, die üblicherweise im Verzeichnis /etc residiert (also /etc/crontab) und die entsprechenden Angaben enthält.

Unix-Workstations, auf denen dieser Mechanismus ursprünglich eingeführt wurde, sind in der Regel durchgängig im 24-Stunden-Betrieb. Daher wirkt die crontab-Steuerung nur exakt zum jeweils eingestellten Zeitpunkt. Ist der Rechner zu dieser Zeit nicht in Betrieb, verfällt der Eintrag und das fragliche Programm wird nicht gestartet.

Linux-PCs sind oft nicht im Dauerbetrieb. Was man hier braucht, ist ein Verfahren, bei dem die crontab-Steuerung zu einem späteren Zeitpunkt einsetzt, falls der PC zur tatsächlich eingestellten Zeit ausgeschaltet war. Programme, deren Ausführung über crontab zum eigentlichen Zeitpunkt versäumt wurde, sollten also nachträglich gestartet werden, sobald der PC wieder in Betrieb ist.

Es gibt dafür alternative Lösungen wie anacron, die aber anscheinend nicht mehr so recht in die aktuelle Systemlandschaft passen. OpenSUSE verwendet einen anderen Ansatz: /etc/crontab enthält einen Eintag, der das Programm /usr/lib/cron/run-crons in kurzen Zeitabständen (alle 15 Minuten) ausführt. Dieses wiederum sucht in den Verzeichnissen /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly nach Programmskripten, die es startet, sobald seit der letzten Ausführung jeweils mindestens 60 Minuten, 24 Stunden, 7 Tage bzw. 30 Tage vergangen sind.

Auf diese Weise kann man also in den betreffenden /etc/cron.*-Verzeichnissen Programme unterbringen, die in regelmäßigen Zeitabständen ausgeführt werden sollen. Für den Systemadministrator ist es allerdings nicht unbedingt die beste Wahl, diese Systemverzeichnisse anzufassen, daher befindet sich unter OpenSUSE standardmäßig im Verzeichnis /etc/cron.daily ein Skript, etwa suse.de-cron-local, das wiederum das Skript /root/bin/cron.daily.local ausführt (falls dieses existiert). Somit kann der Administrator täglich auszuführende Aufgaben über sein eigenes /root/bin-Verzeichnis definieren.

Leider gibt es standardmäßig keine entsprechenden Skripte für stündliche, wöchentliche oder monatliche Zeiträume. Man kann suse.de-cron-local aber so erweitern, dass es sich in diesem Sinne universell verwenden lässt. Im Anhang stelle ich mein Shellskript cron-local zur Verfügung, das eine solche Erweiterung realisiert.

Nach dem Herunterladen und Entpacken von cron-local.gz kopiert oder verlinkt man cron-local einfach in die Verzeichnisse /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly (je nach Bedarf); dabei sollte man nicht vergessen, die jeweilige Datei ausführbar zu machen. (/etc/cron.daily lässt man entweder aus oder löscht das Standardskript suse.de-cron-local o. ä. – wenn vorhanden –, um doppelte Ausführungen zu vermeiden!)

Anschließend kann der Administrator in seinem /root/bin-Verzeichnis Skripte cron.hourly.local, cron.daily.local, cron.weekly.local oder cron.monthly.local (je nach den oben gewählten Verzeichnissen) anlegen, die dann in entsprechenden Zeitabständen ausgeführt werden. Natürlich ist das immer noch optional: Falls eine Datei fehlt, wird das einfach ignoriert.

AnhangGröße
Binärdaten cron-local.gz458 Bytes

Bereich:

System: 
OpenSUSE
Version: 
11.3
Symptom: 

Crontab-gesteuerte Ereignisse finden nicht statt, wenn der PC zur fraglichen Zeit ausgeschaltet ist.