Home > Einsteiger > Cronjob auf dem Raspberry Pi einrichten

Cronjob auf dem Raspberry Pi einrichten

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.

Der Aufbau der Job-Einträge in der Datei ist wie folgt:

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.

Das Script /root/scripts/backup.sh würde nun jeden Tag um 15 Uhr ausgeführt. Wie man an diesem Beispiel sieht werden die Werte die nicht benötigt werden mit einem Stern (*) gekennzeichnet. Es ist in diesem Fall ja egal was für ein Tag ist, in welchem Monat wir uns befinden und auch ob es Dienstag oder Donnerstag ist.

Ü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.

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.

Output und Fehlermeldungen

Schreibt man in die /etc/crontab folgende Zeile

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.

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:

Cronjob Beispiele

Hier noch einige Beispiele für die zeitliche Planung eurer Cronjobs

 

Script wird jede Minute ausgeführt.

 

Bewirkt das Selbe wie der Aufruf oben.

 

Script wird jede Stunde um 10 nach ausgeführt. (14.10, 15.10 etc)

 

Script wird jeden Tag um 10.00 und 12.00 Uhr ausgeführt.

 

Script wird am 2., 3. und 4. jeden Monats um 0.00 Uhr ausgeführt.

 

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.

 

Script wird alle 2 Minuten aufgerufen wobei der Output des Scripts nicht verschickt wird.

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (2 votes, durchschnittlich: 5,00 von 5)
Loading...

Über raspberry.tips

5 Kommentare

  1. 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

  2. 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?!?

    • unter Jesse funktioniert bei mir das @reboot anscheinend auch nicht. Unter Wheezy hatte ich nie Probleme. Gibts da ne Lösung?

  3. 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

  4. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.