Was ist ein Cronjob?
Cronjobs sind Skripte oder Aufgaben, die zu einem bestimmten Zeitpunkt automatisch vom System ausgeführt werden sollen. Das System eignet sich deshalb besonders gut für Aufgaben die immer wieder anstehen und die kein Eingreifen des Users verlangen, zum Beispiel Backups, Logs auswerten, Mails versenden etc. Cronjobs sind eigentlich das Selbe wie die „Geplanten Tasks“ unter Windows.
Wie erstelle ich einen Cronjob?
Die einfachste Möglichkeit vorweg – wem das bereits reicht braucht den der Anleitung nicht mehr zu lesen:
Wenn man ein Script jeden Tag ausführen will, kopiert man es einfach in den Ordner /etc/cron.daily, für einmal pro Woche in /etc/cron.weekly und einmal pro Monat in /etc/cron.monthly und das war’s bereits. Die Rechte des Scripts müssen natürlich stimmen, „chmod 700 script.sh“
Wer mit den Intervallen der vorgefertigten Ordner nicht zurecht kommt hat zwei verschiedene Möglichkeiten einen Cronjob einzutragen. Zum einen von Hand in der Datei /etc/crontab, die aber nur vom User root (sudo su) geändert werden kann oder mit dem Befehl ‚crontab -e‘ (Job läuft unter dem aufrufenden Benutzer).
Wie muss ein Cronjob aussehen?
Zuerst zeige ich euch die Möglichkeit über die Datei /etc/crontab. Wir machen uns zum Root und editieren die Datei mit dem Editor Nano.
1 2 | sudo su nano /etc/crontab |
Der Aufbau der Job-Einträge in der Datei ist wie folgt:
1 | Minute | Stunde | Tag des Monats | Monat | Tag der Woche | Benutzer | Befehl |
Mögliche Zeitwerte für die Planung eines Jobs sind:
- Minute: 0-59
- Stunde: 0-23
- Tag des Monats: 1-31
- Monat: 1-12
- Tag der Woche: Möglich ist 0-7, wobei 0 und 7 jeweils der Sonntag ist.
- User: Der Benutzer unter dem das Script ausgeführt werden soll.
- Befehl: Konsolen-Befehl oder Script das ausgeführt wird
Wie sieht ein solcher Aufruf nun komplett aus?
Ein Job befindet sich immer in einer Zeile der Datei, hier ein Beispiel für einen komplette Cronjob Eintrag.
1 | 0 15 * * * root /root/scripts/backup.sh |
Über den Befehl crontab -e funktioniert das ganz ähnlich, es fällt nur die Spalte Benutzer weg, da das der Job unter dem Benutzer laufen wird, der den Cronjob angelegt hat.
1 | 0 15 * * * /root/scripts/backup.sh |
Für die Zeitplanung eines Cronjobs gibt es noch einige weitere Möglichkeiten die Werte anzugeben:
- Listen: Mit Komma (,) getrennte Werte. Zum Beispiel 8,12 um ein Script um 8 und 12 Uhr auszuführen.
- Zahlenfolgen: Mit Bindestrich (-) getrennte Werte. Zum Beispiel 8-12 um den Job um 8,9,10,11 und 12 Uhr auszuführen.
- Stufen: */Stufe, Wird genutzt um z.B.: „alle fünf Minuten“ oder „jeden 2. Tag“ zu erstellen. Zum Beispiel */2 um das Script alle zwei Stunden auszuführen.
Besondere Aufrufe
Für besondere Ereignisse kann man anstatt der 5 Zeitdaten eines der Folgenden einsetzen:
- @reboot Ausführen beim Systemstart
- @yearly Einmal pro Jahr
- @monthly Einmal pro Monat
- @weekly Einmal pro Woche
- @daily Einmal am Tag
- @hourly Einmal pro Stunde
Folgendes Beispiel führt das Script backup.sh beim Systemstart unter dem Benutzer root aus.
1 | @reboot root /root/scripts/backup.sh |
Output und Fehlermeldungen
Schreibt man in die /etc/crontab folgende Zeile
1 | MAILTO=root |
Wird die gesamte Ausgabe der Jobs per Mail an den User root gesendet, will man nur bei bestimmten Jobs keine Meldung fügt man „> /dev/null“ an den Aufruf an, damit werden die Meldungen, die vom Script generiert werden ins Nichts geleitet und tauchen nicht im Log auf.
1 | 0 15 * * * root /root/scripts/backup.sh > /dev/null |
Um nur Fehler zu erhalten und die Restliche Ausgabe zu unterdrücken kann „2>&1“ angefügt werden, damit werden Fehler auf die Normale Ausgabe umgeleitet, und das ist wieder ins Nichts (/dev/null ). Zum Beispiel:
1 | 0 15 * * * root /root/scripts/backup.sh > /dev/null 2>&1 |
Cronjob Beispiele
Hier noch einige Beispiele für die zeitliche Planung eurer Cronjobs
1 | * * * * * root /root/scripts/backup.sh |
Script wird jede Minute ausgeführt.
1 | */1 * * * * root /root/scripts/backup.sh |
Bewirkt das Selbe wie der Aufruf oben.
1 | 10 * * * * root /root/scripts/backup.sh |
Script wird jede Stunde um 10 nach ausgeführt. (14.10, 15.10 etc)
1 | 0 10,12 * * * root /root/scripts/backup.sh |
Script wird jeden Tag um 10.00 und 12.00 Uhr ausgeführt.
1 | 0 0 2-4 * * root /root/scripts/backup.sh |
Script wird am 2., 3. und 4. jeden Monats um 0.00 Uhr ausgeführt.
1 | 40,50 13 */2 4-8 * root /root/scripts/backup.sh > /dev/null 2>&1 |
Script wird vom April bis August jeden zweiten Tag um 13.40 und 13.50 ausgeführt, wobei die Ausgabe wie auch die Fehlermeldungen nicht verschickt werden.
1 | */2 * * * * root /root/scripts/backup.sh > /dev/null |
Script wird alle 2 Minuten aufgerufen wobei der Output des Scripts nicht verschickt wird.
1 | 0 10 * * 1 root /root/scripts/backup.sh |
Angie
>in crontab habe ich stehen:
>*/1 */12 * * * sudo /home/pi/wasser-on-off.sh
Du musst den Nutzer root *nicht* sudo einbauen also
* */12 * * * root /home/pi/wasser-on-off.sh
Zur ERklärung sudo ist ein Befehl, der sagt, dass der nachfolgende als User „root“ ausgeführt werden soll.
MfG Angie
Wolfgang
W.König
EDV-Opa hat ein cronjob Problem. Wollte mit einem Funksteckdosen 3er-Set eine Beleuchtunssteuerung realisieren.
wiringPi installiert, raspberry-remote installiert. Steckdosen sollten sich mit send 10000 1 1 (Beispiel!) ansteuern lassen, geht bei mir nur mit sudo send 10000 1 1 . Die im Beispiel vorgeschlagene Crontab Datei sollte z.B.: so aussehen 30 2 * * * send 100000 1 1 . Damit wir aber keine Steckdose geschaltet, auch nicht wenn ioch sudo send eingebe. Kann mir jemand helfen ??
Vielen Dank
W.König
Schmitt
in crontab habe ich stehen:
*/1 */12 * * * sudo /home/pi/wasser-on-off.sh
in wasser-on-off.sh steht:
EIN
sudo /home/ws/rcswitch-pi/send 01000 5 1 >/dev/null 2>&1
sleep 55
AUS
sudo /home/ws/rcswitch-pi/send 01000 5 0 >/dev/null 2>&1
so geht es bei mir, dem oldieman
Felix
hi. ich bräuchte mal hilfe ^^
habe einen cronjob eingerichtet. ( einfaches .sh script und dieses unter den ordner cron.hourly eingefügt. ) rechte vergeben.
aber trotzdem wird es nicht ausgeführt. habe per nano /var/log/syslog das log ausgelesen zwecks fehler aber ich versteh nicht was da drin steht bzw was die meldung bedeutet. vll kann mir ja hier jemand helfen :D log :
„Oct 24 00:17:01 raspberrypi /USR/SBIN/CRON[15734]: (root) CMD ( cd / && run-parts –report /etc/cron.hourly)“
danke für eure hilfe. grüße felix
Michael Buchholz
… ich kann mich meinem Vorredner.. ähh Schreiber nur anschließen; auf solche Fragestellungen stößt man zwangsläufig als DAU ;)
Aber auch wenn das super erklärt ist, läuft die Nummer auf meinem PI2B unter Jessie nicht….
@reboot root ntpdate -s 192.168.1.111
@hourly root ntpdate -s 192.168.1.111
… funktioniert weder in der /etc/crontab, noch eingetragen (ohne User) via crontab -e, beide mal als root eingeloggt. Führe ich das Commando direkt auf der Konsole aus (via PuTTY), klappt das schmerzfrei.
Das wundert mich vor allen Dingen deshalb, weil dieses HowTo bezgl. ntpdate zigfach in den verschiedensten Bolgs und Seiten dargestellt wird…
Was ist denn bei mir so anders?!?
juergen
unter Jesse funktioniert bei mir das @reboot anscheinend auch nicht. Unter Wheezy hatte ich nie Probleme. Gibts da ne Lösung?
Gunter
Hallo,
tolle Sache, wenn sich jemand die Mühe macht um solche Tips allgemein zugänglich zu machen. Allerdings habe ich einige Probleme der Logik bei Deinen Ausführungen zu den cron jobs zu folgen. Hier bezieht sich Dein Kommentar mal auf den folgenden Code Abschnitt und mal auf den darüberstehenden. Das ist sehr schwer nachzuvollziehen.
Wo ist der Unterschied bei diesen beiden Ausführungen? :
0 15 * * * root /root/scripts/backup.sh > /dev/null 2>&1
bzw.
0 15 * * * root /root/scripts/backup.sh > /dev/null
Was bewirkt „2>&1“ wenn vorher das Null-Device als Ausgabe festgelegt wird? Landet jetzt etwas im Log oder nicht?
Übrigens hat sich ein Typo in den Hinweis auf den Datenschutz eingeschlichen. Es gibt weder „Hinweiße“ noch „Hinschwarze“.
Übrigens haben mich meine Schüler, die ich auf Deine Tips hingewiesen hatte, aufmerksam gemacht.
Gruß
Gunter