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:
1 |
Minute Stunde Tag Monat Wochentag Befehl |
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:
1 2 |
* 8,9,10,11 * * * Befehl * 8-11 * * * Befehl |
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:
1 2 |
crontab -l crontab -l >> mycronjobs.txt |
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
1 |
crontab -e |
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.
1 |
crontab MyCronjobs.txt |
Systemintern werden die crontabs aller Benutzer in folgendem Verzeichnis abgelegt:
/var/spool/cron/crontabs
1 2 3 4 |
root@raspi2-markus:/var/spool/cron/crontabs# ll total 8 -rw------- 1 pi crontab 234 Aug 13 18:04 pi -rw------- 1 root crontab 230 Aug 16 20:39 root |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) */15 * * * * root /home/pi/upload.py >/dev/null 2>&1 |
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:
1 2 3 |
pi@raspi ~ $ crontab -l 00 09 * * 1-5 echo 'Hallo Welt' 00 03 * * * ./backup.py |
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.