Cronjobs auf dem Raspberry Pi

Wiederkehrende Tätigkeiten können auf dem Raspberry Pi und auch auf jedem anderen Linux/Unix System mit Hilfe von Cronjobs ausgeführt werden.

Mögliche Anwendungen sind:

  • Regelmäßiges Backup um 3 Uhr morgens.
  • alle 15 Minuten den Wert eines Temperatursensor abfragen und in eine Datenbank speichern.
  • 1 mal in der Woche Logfiles löschen

Die Anzahl der Cronjobs, die gespeichert werden können ist dabei mehr oder weniger unbegrenzt. Jeder Benutzer des System besitzt dabei seine eigene Tabelle in der seine Cronjobs verwaltet werden. Die Tabelle in der die Cronjobs gespeichert werden, wird Crontab genannt. Lt. Wikipedia setzt sich Crontab aus den beiden Wörtern chronos = die Zeit und lat. tabula = die Tafel zusammen. Jede Zeile der Tabelle stellt dabei einen Cronjob dar. Die Cronjobs werden dabei mit dem jeweiligen Benutzerkonto ausgeführt. Cronjobs des Benutzers ‚pi‘ werden also als Benutzer ‚pi‘ ausgeführt.

Der Aufbau einer Zeile ist immer gleich und besitzt folgendes Format:

Die einzelnen Werte sind dabei mit Leerzeichen oder Tabulator getrennt

  • Minute: 0-59
  • Stunde: 0-23
  • Tag: 1-31
  • Monat: 1-12
  • Wochentag: 0-7,
    • 0, 7: Sonntag
    • 1-5: Montag – Freitag

Wird ein Wert nicht benötigt und soll er ignoriert werden so wird einfach ein * an dieser Stelle geschrieben. Mehrere Werte (Listen) sind durch einen Beistrich zu trennen.
Folgender Eintrag würde das Script jeden Montag um 1:10 und 1:30 starten: 10,30 1 * * 1 ./script.py
Ein Bereich kann mit folgenden Syntax angegeben werden: Start-Ende. Start und Endwert sind dabei durch einen Bindestrich getrennt.
Um also jeweils um 8, 9, 10 und 11 Uhr einen Cronjob auszuführen gibt es nun 2 Möglichkeiten:

Listen und Bereiche können auch gemeinsam genutzt werden.
Um ein Script am 1, 5, und vom 15-20 des Monats jeweils um 10:00 auszuführend ist folgender Eintrag notwendig
0 10 1,5,15-20 * * Befehl

Mit folgenden Befehl lassen sich die aktuellen Cronjobs des Benutzer anzeigen:

Der 1. Befehl gibt dabei die aktuellen Cronjobs auf der Console aus. Mit dem zweiten Befehl wird die Ausgabe des Befehls in eine Datei ‚mycronjob.txt‘ umgeleitet, um sie anschliessen z.B.: mit einem Script bearbeiten zu können. Es werden dabei immer die Cronjobs jenes Benutzers ausgegeben der den Befehl ausführt. In diesem Beispiel wurde der Befehl als User ‚pi‘ ausgeführt, dementsprechend wird der Crontab Inhalt des Benutzers ‚pi‘ angezeigt. Soll der Crontab eines bestimmten Benutzers ausgegeben werden so muss der Befehl entweder als dieser Benutzer ausgeführt werden oder es wird der Parameter ‚-u username‘ verwendet.

Um nun z.B.: die Cronjobliste des Benutzers ‚foo‘ auszugeben ist folgender Befehl notwendig: crontab -l -u foo

Cronjob anlegen/editieren

Die cronjob Tabelle kann mit folgendem Befehl editiert werden

Ein Editor mit dem Inhalt des crontab öffnet sich. Nun können darin bestehende cronjobs gelöscht/editiert bzw. neue cronjobs hinzugefügt werden.

Manchmal kann  es auch sinnvoll sein, die cronjob Datei zuerst zu erstellen (z.B.: mit Hilfe eines Scripts) und anschliessen dem Crontab zu übergeben.
Hat man also alle seine cronjobs in die Datei ‚MyCronjobs.txt‘ eingetragen so werden diese mit dem folgenden Befehl dem crontab übergeben.

 

Systemintern werden die crontabs aller Benutzer in folgendem Verzeichnis abgelegt:
/var/spool/cron/crontabs

Für jeden Benutzer im System für den cronjobs konfiguriert sind, existiert in diesem Verzeichnis eine Datei (Dateiname = Benutzername).
Der Inhalt der Datei entspricht dem selben wie die Ausgabe des Befehls: ‚crontab -l‘

Systemweite Cronjob Tabelle

In der Datei /etc/crontab sind alle Systemweiten CronJobs abgelegt. Der Inhalt dieser Datei unterscheidet sich nur in einem Punkt von herkömmlichen Cronjob Einträgen. Es besitzt eine zusätzliche Spalte mit der explizit angegeben werden kann, unter welchem Benutzerkonto der jeweilige CronJob ausgeführt werden soll.

Nach der Angabe für Datum/Uhrzeit gibt es eine neue Spalte in der der zu verwendete Benutzername steht, unter dem der CronJob laufen soll. In der nächsten Spalte folgt wieder wie gewohnt der auszuführende Befehl.

Die Verwendung eines Systemweiten CronJobs macht z.B.: Sinn wenn man einen Server administriert und hier verschiedene Prozesse mit verschiedenen Benutzerkonten laufen (Apache, …).

 

Beispiele:

Zeile 2: Dieser Cronjob wird von Montag-Freitag (1-5) jeweils um 9:00 Uhr ausgeführt. Dabei wir der Befehle echo ‚Hallo Welt‘ aufgerufen.
Zeile 3: Das Script ‚backup.py‘ wird jeden Tag um 3 Uhr aufgerufen.

Weiterführende Informationen zu Crontab können der entsprechenden Man Page entnommen werden.