Cronjobs sind Aufgaben, die Linux automatisch zu bestimmten Zeiten ausführt. Wir ihr selbst eigene Aufgaben planen und hinzufügen könnt, erklären wir euch hier.
Cronjobs wirken auf den ersten Blick vielleicht etwas komplex, sie sind aber ein mächtiges Tool, wenn man die Grundlagen erstmal verstanden hat.
- 1.Was sind Cronjobs?
- 2.Derzeitige Cronjobs anzeigen
- 3.Cronjobs hinzufügen, ändern oder löschen
- 4.Syntax von Cronjobs
- 4.1.Einfaches Beispiel
- 4.2.Weitere Beispiele für Cronjobs
- 4.3.Cronjob nach jedem Neustart ausführen
- 4.4.Crontab-Zeile generieren lassen
- 5.Fehlerbehebung und prüfen, ob Cronjobs gestartet wurden
- 5.1.Was bedeutet „No MTA installed, discarding output“?
- 6.Cronjob-Ausgabe in Datei umleiten oder verwerfen
- 7.Cronjobs für anderen Nutzer erstellen
- 8.Cronjob als Root durchführen (Systemverwalter)
Was sind Cronjobs?
Cronjobs sind in Linux Aufgaben, die das Betriebssystem automatisch zu bestimmten Zeiten (immer wieder) durchführen soll. In einer bestimmten Textdatei wird dazu pro Zeile angegeben, was getan werden soll. Dort kann man beispielsweise den Speicherort eines Skripts angeben, das zu einem vorgegebenen Zeitpunkt gestartet werden soll.
Beispiel: Ihr habt ein ausführbares Skript namens „backup.sh“ geschrieben, das ein Backup eines bestimmten Ordners von eurem Betriebssystem über das Netzwerk sichert. Dieses Skript soll nun jeden Mittwoch zu einer bestimmten Uhrzeit ausgeführt werden. Dies und mehr kann man mit Cronjobs erledigen.
Derzeitige Cronjobs anzeigen
Cronjobs – also wiederkehrende Aufgaben – verwaltet ihr in Linux mit dem Kommandozeilen-Programm „Crontab“, über das ihr eure Cronjobs in einer einfachen Textdatei eintragt. Im Terminal zeigt ihr aktuell geplante Aufgaben mit folgendem Befehl an:
crontab -l
Wird euch nur eine leere Textdatei angezeigt, sind derzeit keine Cronjobs geplant. In der Datei steht ansonsten jede Zeile für eine Aufgabe. Einzelne Aufgaben können auch mit dem Raute-Zeichen „#“ am Anfang der Zeile auskommentiert werden. Die Kommentarfunktion kann auch genutzt werden, um über dem jeweiligen Cronjob eine Beschreibung der eigentlichen Aufgabe einzugeben, da aus der Zeile auf Anhieb nicht immer ersichtlich ist, was der Cronjob eigentlich tut.
Cronjobs hinzufügen, ändern oder löschen
Um Cronjobs der Crontab-Datei hinzuzufügen, zu ändern oder zu löschen, gebt ihr im Terminal den folgenden Befehl ein:
crontab -e
Wenn ihr den Befehl zum ersten Mal auf eurem System ausführt, werdet ihr vermutlich gefragt, welchen Editor ihr nutzen wollt, um die Datei zu bearbeiten. Wir empfehlen „nano“, sofern vorhanden, weil dieser recht einfach zu bedienen ist.
Syntax von Cronjobs
Die Syntax von Cronjobs lässt sich mit folgendem Befehl anzeigen:
cat /etc/crontab
<strong>* * * * * auszuführender Befehl
│ │ │ │ │
│ │ │ │ └──── Wochentag (1-7 oder mon,tue,wed,thu,fri,sat,sun)
│ │ │ └────── Monat (1-12)
│ │ └──────── Tag (1-31)
│ └────────── Stunde (0-23)
└──────────── Minute (0-59)</strong>
Einfaches Beispiel
Die folgende Zeile startet jeden Mittwoch um 13 Uhr das Skript „backup.sh“ im Ordner /home/ralf/bin
:
0 13 * * 3 /home/ralf/bin/backup.sh
Ein Stern * an der jeweiligen Stelle bedeutet, dass der Befehl immer ausgeführt wird – also zu jeder Minute, jeder Stunde, jedem Tag, jedem Monat beziehungsweise jedem Wochentag. Wenn man vor der Zeile also nur Sterne stehen hat ( * * * * * ), wird der dahinterstehende Befehl jede Minute ausgeführt. Außerdem sind für die Stellen folgende Optionen möglich:
* = Ausführung immer (zu jeder…)
*/n = alle n Zeitpunkte wird der Befehl ausgeführt
n,x,y = Ausführung um/am n, x und y
Weitere Beispiele für Cronjobs
- Das Skript „skript.sh“ wird um 6 Uhr morgens durchgeführt:
0 6 * * * /home/ralf/bin/skript.sh
- Das Skript wird alle 20 Minuten durchgeführt:
*/20 * * * * /home/ralf/bin/skript.sh
- Das Skript wird um 7 Uhr, um 14 Uhr und um 21 Uhr durchgeführt:
0 7,14,21 * * * /home/ralf/bin/skript.sh
- Das Skript wird am 26.08. um 17:07 Uhr ausgeführt:
7 17 26 8 * /home/ralf/bin/skript.sh
- Das Skript wird um 5:00 Uhr (0 5) an jedem Tag zwischen dem 6. bis 17. November UND zusätzlich an jedem Dienstag (2) im November (11) aufgerufen. In diesem Beispiel muss nur entweder der Tag des Monats (6.-17.) oder der bestimmte Wochentag (Dienstag) übereinstimmen, damit die Aufgabe startet.
0 5 6-17 11 2 /home/ralf/bin/skript.sh
Zu letztem obigen Beispiel gilt: Wenn sowohl „Tag des Monats“ (der 3. Stern) als auch „Tag der Woche“ (der 5. Stern) vorgegeben werden (also nicht * dort steht), muss nur ein Kriterium für das aktuelle Datum erfüllt werden, damit die Aufgabe startet.
Cronjob nach jedem Neustart ausführen
Außerdem könnt ihr Cronjobs auch stündlich oder nach jedem Reboot wie folgt starten lassen:
- Führt das Skript stündlich durch:
@hourly /home/ralf/bin/skript.sh
- Führt das Skript nach jedem Reboot durch:
@reboot /home/ralf/bin/skript.sh
Crontab-Zeile generieren lassen
Falls euch die Syntax für die Crontab-Zeile zu kompliziert ist, könnt ihr auch einen Cronjob-Generator benutzen. Gebt dazu auf der folgenden Webseite ein, wann die Aufgabe gestartet werden soll. Ihr erhaltet dann die richtigen Zeitangaben für die Crontab-Zeile.
Fehlerbehebung und prüfen, ob Cronjobs gestartet wurden
Wenn ihr Cronjobs in die Crontab-Datei hinzufügt, möchtet ihr vermutlich wissen, ob Linux die Aufgabe auch ausgeführt hat. Mit dem folgenden Befehl öffnet ihr die Log-Datei für Cronjobs:
grep CRON /var/log/syslog
Was bedeutet „No MTA installed, discarding output“?
Was bedeutet es, wenn in der Log-Datei der Cronjobs die folgende Zeile angezeigt wird?
May 28 17:41:01 ralf CRON[107962]: (CRON) info (No MTA installed, discarding output)
Erklärung: Standardmäßig will Crontab die Ausgabe von Cronjobs an den Benutzer per E-Mail schicken. Die Zeile oben bedeutet, dass zwar versucht wurde, eine E-Mail als Benachrichtigung an den Benutzer zu verschicken, allerdings kein E-Mail-Service gefunden wurde. Die Ausgabe wurde deshalb verworfen. Ihr könnt die Zeile also ignorieren oder bei Bedarf einen E-Mail-Service mit folgendem Befehl in Debian-basierten Systemen wie Ubuntu installieren:
sudo apt-get install postfix
Alternativ gebt in der Crontab-Datei selbst an, dass die Ausgabe stattdessen in eine bestimmte Log-Datei umgeleitet werden soll, wie wir im Folgenden zeigen.
Cronjob-Ausgabe in Datei umleiten oder verwerfen
Standardmäßig sendet Crontab die Ausgabe von Cronjobs per E-Mail an den Nutzer. Falls da nicht gelingt, wird die Ausgabe nach Durchführung des Cronjobs verworfen und darüber in der Log-Datei /var/log/syslog
protokolliert. Mit diesem Befehl speichert ihr die Ausgabe des Cronjobs (Ausführung des Skripts „backup.sh“) in einer eigenen Log-Datei namens „backup.log“ im Home-Verzeichnis des aktuellen Nutzers:
0 13 * * 3 /home/ralf/bin/backup.sh > $HOME/`date +\%Y-\%m-\%d-\%H-\%M`-backup.log 2>&1
Mit jeder neuen Ausführung des Cronjobs wird eine neue Log-Datei erstellt und deren Dateiname folgt dabei der Syntax: Jahr-Monat-Tag-Uhrzeit-backup.log
. Alternativ könnt ihr die Ausgabe auch jedes mal nur in eine bestimmte Datei schreiben lassen. Die Datei wird dann also immer länger:
0 13 * * 3 /home/ralf/bin/backup.sh >> $HOME/backup.log 2>&1
Beachtet: „>>“ bedeutet, dass die Ausgabe dem vorhandenen Inhalt der Datei hinzugefügt wird. Falls ihr nur „>“ benutzt, wird die Datei jedes Mal überschrieben und der vorherige Inhalt wird dabei gelöscht. Wenn ihr die Ausgabe lieber gleich verwerfen wollt, lautet die Crontab-Zeile:
0 13 * * 3 /home/ralf/bin/backup.sh > /dev/null 2>&1
Erklärung: Die Zeichenfolge /dev/null
lässt die Ausgabe verschwinden und 2>&1
weist Linux an, alle möglichen Fehler (2) an die gleiche Stelle (&1) zu leiten, wodurch diese auch verschwinden.
Cronjobs für anderen Nutzer erstellen
Mit den obigen Befehlen verwaltet ihr Cronjobs nur für den aktuell angemeldeten Benutzer. Wenn ihr Cronjobs für einen anderen Benutzer anlegen wollt, nutzt ihr die Befehlssyntax:
crontab -u NUTZER -e
Statt „Nutzer“ gebt ihr den jeweiligen Benutzernamen ein. Falls ihr also Cronjobs für den Benutzer „Ralf“ verwalten wollt, würde der Befehl lautet:
crontab -u ralf -e
Cronjob als Root durchführen (Systemverwalter)
Falls ihr Crontabs für den Systemverwalter „root“ anlegen wollt, müsst ihr vorne noch sudo
hinzufügen:
sudo crontab -u root -e
Neben dem Crontab-Befehl gibt es je nach Linux-Distribution auch noch weitere Dateien, die systemweite Crontabs enthalten. Diese können nur durch den Nutzer „root“ bearbeitet werden. Die Datei findet ihr bei /etc/crontab
und lässt sich mit folgendem Befehl im Editor „nano“ bearbeiten:
sudo nano /etc/crontab
In System-Crontab-Dateien müsst ihr aber zusätzlich den System-Benutzer angeben, der den Befehl ausführen soll. Die entsprechenden Zeilen sehen dann beispielsweise so aus:
@reboot root /home/ralf/bin/skript.sh > /dev/null 2>&1
0 13 * * 3 ralf /home/ralf/bin/skript.sh > /dev/null 2>&1
Falls euch ein Video lieber ist, zeigt euch der YouTube-Kanal „Learn Linux TV“ die Grundlagen für Cronjobs in Linux (Englisch-sprachig):