Crontab

Der Cron Daemon ist ein Unix Dienst, welcher Skripte oder Programme zu beliebigen Zeiten in gewünschten Zyklen ausführt. Die auszuführenden Befehle werden in einer Tabelle, der sogenannten crontab hinterlegt. Im Systemhintergrund überprüft ein Service permanent nach auszuführenden Tätigkeiten. Hierbei wird zwischen Systemweiten Crontabs, als auch benutzerdefinierten Crontabs unterschieden.
Ein möglicher Anwendungsfall wäre zum Beispiel die tägliche Archivierung wichtiger Dokumente. Zur Demonstration wird ein Crontab angelegt, der minütlich das Datum in eine Textdatei schreibt.

Aufbau der Crontab Tabelle

Die Crontab Tabelle besteht insgesamt aus sechs Spalten, wobei die ersten fünf Spaltenangaben zur zeitlichen Ausführung des in der sechsten Spalte enthaltenen Befehls verantwortlich sind. Jede Spalte wird durch ein Leerzeichen oder ein Tab getrennt.

*   *   *   *   *  auszuführender Befehl 
|   |   |   |   |
|   |   |   |   |
|   |   |   |    ----- Wochentag (0 - 7) 
|   |   |   |     (0 und 7 ist der Sonntag)
|   |   |    ------- Monat (1 - 12)
|   |    --------- Tag (1 - 31)
|    ----------- Stunde (0 - 23)
 ------------- Minute (0 - 59)

Ein Sternchen steht für jede mögliche Variante einer Zeitangabe. Sollte als Beispiel ein Sternchen für die Tageinheit angegeben werden, wird der Befehl an jedem Tag ausgeführt. Analog verhält sich das Sternchen bei den anderen Spalten (jedes Jahr, jeder Monat …).
Für die Monate sowie für die Wochentage können statt der Zahlen, auch die in englisch gebräuchlichen Namen verwendet werden. Hierbei dürfen lediglich die ersten drei Buchstaben des Wortes verwendet werden. So kann beispielsweise anstatt des zweiten Wochentags (Zahl 1) auch mon geschrieben werden (der Wochentag beginnt bei crontab immer Sonntags (0)).
Ebenfalls ist es möglich ausgewählte Wochentage anzugeben. Der Wert 1-5 (wichtig: ohne Leerzeichen) würde bedeuten, das der Befehl von Montag bis Freitag ausgeführt wird, nicht jedoch am Wochenende. Der Wert 1,3,5 (wichtig: ohne Leerzeichen) führt den Befehl am Montag, Mittwoch und Freitag aus. Gleiches gilt natürlich auch für die anderen Werte (Monate, Jahre, ..).
Statt der Zahlen oder aber auch die Verwendung der ersten drei Buchstaben des Wochentages, können für die ersten fünf Felder auch bestimmte Schlüsselwörter angegeben werden.

Wert Resultat Alternativ
@hourly Stündlich 0 * * * *
@midnight Täglich 0 0 * * *
@daily Täglich 0 0 * * *
@weekly Wöchentlich 0 0 * * 0
@monthly Monatlich 0 0 1 * *
@annually Jährlich 0 0 1 1 *
@yearly Jährlich 0 0 1 1 *
@reboot Nach jedem Neustart  

Weitere Crontab Beispiele

Hier nun ein paar konkrete Beispiele einiger Zeitangaben eines Crontabs.

Cron Beispiel Resultat
15 * * * * Immer 15 Minuten nach einer vollen Stunde
*/15 * * * * Alle 15 Minuten
15 0 * * * Jeden Tag 15 Minuten nach Mitternacht
15 20 10 * * Jeden 10ten Tag eines Monats um 20:15 Uhr
0 6 * * 1-5 Jeder Wochentag um sechs Uhr morgens
6 6 * * tue Jeden Dienstag um sechs Minuten nach sechs

Wenn Ihr der Meinung seid, das ich wichtige Beispiele vergessen habe, dann bitte ich euch dies in einen Kommentar zu hinterlassen. Ich werde die Tabelle anschließend komplettieren.

Wichtiger Hinweis

Am Ende der Crontab Tabelle muss eine Leerzeile eingefügt werden!

Crontab einrichten

Um einen benutzerdefinierten crontab einzurichten, muss folgender Unix Befehl in einen Terminal eingegeben werden:

crontab -e

Der Parameter -e veranlasst das Erstellen eines neuen Crontabs. Wird dieser Befehl zum ersten Mal aufgerufen, fragt in der Regel der Terminal nach einen gewünschten Editor. Unter Ubuntu stehen hier ed, nano und vim standardmäßig zur Verfügung.
Anschließend öffnet sich eine Datei, in der nochmals ein paar einführende Worte zu cron verloren werden. Die am Zeilenanfang befindlichen Hashes (#) signalisieren, das es sich bei den jeweiligen Zeilen um Kommentarzeilen handelt. Wer diese Informationen nicht weiter benötigt, kann das Datenblatt selbstverständlich leeren.

Benutzerdefinierter Crontab

Der Besitzer des neu erstellten Crontabs ist immer der eingeloggten User. Möchte man beispielsweise für einen andere User einen Crontab anlegen, geschieht dies über einen zusätzlichen siebten Parameter. Der Username wird in diesem Fall nach der Zeitangabe und vor dem auszuführenden Befehl angegeben (im folgenden mit <username> gekennzeichnet).

* * * * * <username> Befehl

Testdatei anlegen

Zur Demonstration des Crontabs wird eine Datei mit dem Namen time.sh angelegt. Es wird der einzeilige Unix Befehl

date

als Inhalt gespeichert. date gibt das aktuelle Datum inklusive Zeit aus. Diese Datei soll nun minütlich ausgeführt und das Ergebnis in eine Textdatei ergebnis.txt gespeichert werden. Ein neuer Crontab wird wie folgt angelegt:

*/1 * * * * /pfad/zur/time.sh >> pfad/zur/ergebnis.txt

Nach dem Speichern des Crontabs, wird die Zeit in Minutentakt in die Datei ergebnis.txt geschrieben.

Hinweis: Es kann gut möglich sein, dass das Recht der Datei time.sh noch geändert werden muss (chmod 755 time.sh).

Alternativ würde in diesem einfachen Fall auch folgender Befehl für das selbe Resultat sorgen:

*/1 * * * * date >> pfad/zur/ergebnis.txt

Crontab Liste anzeigen

Der Parameter -l listet die Crontabelle mit allen Crontabs auf.

crontab -l

Benutzerdefinierte Crontabs können über den Parameter -u <username> angezeigt werden:

crontab -u <username> -l

E-Mail Benachrichtigung

Als Standard wird die Ausgabe eines Skriptes an die im System lokal hinterlegte E-Mail Adresse gesendet. Wenn dies nicht erwünscht ist, oder aber das Ergebnis an eine andere beliebige Adresse versendet werden soll, gibt es auch hierfür eine passende Lösung.

E-Mail Benachrichtigung deaktivieren

*/1 * * * * pfad/zu/meinem/skript.sh > /dev/null 2> &1

E-Mail Benachrichtigung an eine beliebige Adresse

Über die Angabe MAILTO kann das Ergebnis des Skriptes an eine beliebige Adresse versendet werden.

MAILTO="meine-adresse@anbieter.de
*/1 * * * * pfad/zu/meinem/skript.sh

Crontab löschen

Der -r Paramter löscht alle Crontabs.

crontab -r

Sollen lediglich benutzerspezifische Crontabs gelöscht werden, passiert dies -u <username> mit:

crontab -r -u <username>