CRONTAB(5)

BEZEICHNUNG
crontab - Tabellen zum Betrieb von Cron

BESCHREIBUNG
Eine crontab-Datei enthält Anweisungen für den Daemon cron(8) in der algemeinen Weise: »führe diesen Befehl zu dieser Zeit an diesem Datum aus«. Jeder Benutzer hat seine eigene Crontab. Befehle in diesen übergebenen Crontabs werden unter der Benutzerkennung des Eigentümers der jeweiligen Crontab ausgeführt. Uucp und News werden normalerweise ihre eigenen Crontabs haben, wodurch der explizite Aufruf von su(1) als Teil des Cron-Befehls vermieden wird.

Leere Zeilen und vorangestellte Leerzeichen und Tabulatoren werden ignoriert. Zeilen, deren erstes Zeichen (nach möglichen Leerzeichen) eine Raute (#) ist, sind Kommentare und werden ignoriert. Beachten Sie, dass Kommentare nicht auf den gleichen Zeilen wie Cron-Befehle erlaubt sind, da sie als Teil des Befehls betrachtet werden. Entsprechend sind Kommentare nicht auf der gleichen Zeile wie Zuweisungen der Umgebungsvariablen erlaubt.

Eine aktive Zeile in einer Crontab wird entweder eine Umgebungseinstellung oder ein Cron-Befehl sein. Die Crontab-Datei wird von oben nach unten ausgewertet, daher betreffen alle Umgebungseinstellungen nur die Cron-Befehle, die nach diesen in der Datei vorkommen. Eine Umgebungseinstellung hat die folgende Form:

Name = Wert

Dabei sind Leerzeichen um das Gleichheitszeichen (=) herum optional und alle folgenden und nicht am Anfang stehenden Leerzeichen in Wert werden als Teil des Name zugewiesenen Wertes betrachtet. Der Wert kann in einfache oder doppelte (aber zueinander passende) englische Anführungszeichen eingeschlossen werden, um führende oder abschließende Leerraumzeichen zu erhalten. Um eine leere Variable zu definieren, müssen englische Anführungszeichen verwandt werden.

Die Zeichenkette Wert wird nicht auf Umgebungsvariablenersetzung oder der Ersetzung von Variablen oder der Tilde- (~)-Erweiterung hin ausgewertet, daher werden Zeilen der Form

PATH = $HOME/bin:$PATH
PATH = ~/bin:/usr/bin:/bin

nicht so funktionieren, wie Sie es erwarten. Auch dies wird nicht funktionieren:

A=1
B=2
C=$A $B

Für die im letzten Wert definierte Variable wird es keine Ersetzung geben.

Durch den cron(8)-Daemon wird eine Reihe von Umgebungsvariablen eingerichtet. Shell wird auf /bin/sh und LOGNAME und HOME werden aus der /etc/passwd-Zeile des Crontab-Eigentümers gesetzt. PATH wird auf »/usr/bin:/bin« gesetzt. HOME, SHELL und PATH können durch Einstellungen in der Crontab außer Kraft gesetzt werden; LOGNAME ist der Benutzer, von dem der Auftrag gestartet wurde und kann nicht geändert werden.

(Ein weitere Hinweis: die Variable LOGNAME wird auf BSD-Systemen manchmal USER genannt… auf diesen Systemen wird USER auch gesetzt.)

Zusätzlich zu LOGNAME, HOME und SHELL wird cron(8) auch MAILTO und MAILFROM prüfen, falls es einen Grund dafür hat, E-Mails als Konsequenz der Ausführung von Befehlen in »dieser« Crontab zu senden.

Falls MAILTO definiert (und nicht leer) ist, wird E-Mail an den so benannten Benutzer gesandt. MAILTO kann auch dazu verwandt werden, E-Mail an mehrere Empfänger zu lenken, indem die Empfängerbenutzer durch Kommata getrennt werden. Falls MAILTO definiert, aber leer ist (MAILTO=""), wird keine E-Mail versandt. Andernfalls werden E-Mails an den Eigentümer der Crontab gesandt.

Falls MAILFROM definiert ist, wird die Absender-E-Mail-Adresse auf MAILFROM gesetzt. Andernfalls wird die E-Mail von »root (Cron Daemon)« gesandt.

Auf dem Debian GNU/Linux-System unterstützt Cron das Modul pam_env und lädt die durch /etc/environment und /etc/security/pam_env.conf definierte Umgebung. Es liest auch Locale-Informationen aus /etc/default/locale. Allerdings setzen PAM-Einstellungen weder die oben beschriebenen noch weitere, in der crontab-Datei selbst angegebenen Einstellungen, NICHT außer Kraft. Beachten Sie insbesondere, dass Sie den PATH in der Crontab-Datei selbst setzen müssen, wenn Sie etwas anderes als »/usr/bin:/bin« haben möchten.

Standardmäßig sendet Cron E-Mails mit dem Header »Content-Type:« auf »text/plain« und dem Parameter »charset=« auf die Tastaturbelegung / die Codeliste der Locale gesetzt, in der crond(8) gestartet wurde – d.h. entweder der Standard-System-Locale, falls keine LC_*-Umgebungsvariablen gesetzt sind, oder der durch die LC_*-Umgebungsvariablen festgelegten Locale (siehe locale(7)). Durch Setzen der Variablen CONTENT_TYPE und CONTENT_TRANSFER_ENCODING in den Crontabs können Sie andere Zeichenkodierungen für versandte Ausgaben von Cron-Aufträgen setzen. Diese Variablen müssen auf die korrekten E-Mail-Header des gleichen Namens gesetzt werden.

Das Format eines Cron-Befehls ist fast der V7-Standard, mit einer Reihe von vorwärtskompatiblen Erweiterungen. Jede Zeile hat fünf Zeit-und-Datum-Felder, gefolgt von einem Befehl, gefolgt von einem Zeilenumbruchzeichen (»\n»). Die System-Crontab verwendet das gleiche Format, außer dass der Benutzername für den Befehl nach den Zeit-und-Datum-Feldern und vor dem Befehl angegeben wird. Dies Felder können durch Leerzeichen oder Tabulatoren getrennt werden. Die maximal erlaubte Länge für die Befehlsfelder ist 998 Zeichen.

Befehle werden durch cron(8) ausgeführt, wenn die Minuten-, Stunden- und Monat-des-Jahres-Felder mit der aktuellen Zeit übereinstimmen und wenn mindestens eines der zwei Tagesfelder (Tage des Monats oder Tag der Woche) mit der aktuellen Zeit übereinstimmt (siehe nachfolgenden »Hinweis«). cron(8) untersucht Cron-Einträge einmal pro Minute. Die Zeit- und Datumsfelder sind:

    Feld    Zulässige Werte
    -----    --------------
    Minute    0…59
    Stunde    0…23
    Tag des Monats    1…31
    Monat    1…12 (oder englische Namen, siehe unten)
    Tag der Woche    0…7 (0 oder 7 ist Son, oder verwenden Sie englische Namen)

Ein Feld kann einen Stern (*) enthalten, der immer für »erster-letzter« steht.

Zahlenbereiche sind erlaubt. Bereiche sind zwei durch einen Bindestrich getrennte Zahlen. Der Bereich schließt die angegebenen Zahlen ein. Beispielsweise legt »8-11« für einen »Stunden«-Eintrag die Ausführung zu den Stunden 8, 9, 10 und 11 fest.

Listen sind erlaubt. Eine Liste ist eine durch Kommata getrennte Gruppe von Zahlen (oder Bereichen). Beispiele: »1,2,5,9«, »0-4,8-12«.

Im Zusammenhang mit Bereichen können Schrittwerte verwandt werden. Wird an einen Bereich »/<Zahl>« angehängt, dann legt dies den numerischen Wert für die Schritte durch den Bereich fest. Beispielsweise kann »0-23/2« im Stunden-Feld verwandt werden, um die Ausführung zu jeder zweiten Stunde festzulegen (die Alternative im V7-Standard ist »0,2,4,6,8,10,12,14,16,18,20,22«). Schritte sind auch nach einem Stern erlaubt, falls Sie also »alle zwei Stunden« festlegen möchten, verwenden Sie einfach »*/2«.

Für die Felder »Monat« und »Tag der Woche« können auch englische Namen verwandt werden. Verwenden Sie die ersten drei (englischen) Buchstaben des bestimmten Tages oder Monats (Groß-/Kleinschreibung ist egal). Bereiche oder Listen von Namen sind nicht erlaubt.

Das »sechste« Feld (der Rest der Zeile) legt den auszuführenden Befehl fest. Der gesamte Befehlsanteil der Zeile, bis zu einem Zeilenumbruch oder dem %-Zeichen wird durch /bin/sh oder der durch die Variable SHELL der Crontab-Datei festgelegten Shell ausgeführt. Prozentzeichen (%) im Befehl werden in Zeilenumbruchzeichen umgewandelt, falls sie nicht mit dem Rückwärtsschrägstrich (\) maskiert sind und alle Daten nach dem ersten % werden an den Befehl als Standardeingabe gesandt. Es gibt keine Möglichkeit, einen einzelnen Befehl auf mehrere Zeilen aufzuteilen, wie mit dem abschließenden »\« der Shell.

Hinweis: Der Tag der Ausführung des Befehls kann über zwei Felder festgelegt werden — Tag des Monats und Tag der Woche. Falls beide Felder eingeschränkt sind (d.h. nicht mit * beginnen) wird der Befehl ausgeführt, wenn eines der beiden Felder auf die aktuelle Zeit passt. Beispielsweise würde
»30 4 1,15 * 5« dazu führen, dass ein Befehl um 4:30 Uhr am 1. und am 15. jedes Monats sowie jeden Freitag ausgeführt würde. Sie können allerdings das gewünschte Ergebnis erhalten, indem Sie dem Befehl einen Test hinzufügen (siehe das letzte Beispiel in nachfolgender BEISPIEL-CRON-DATEI).

Anstatt der ersten fünf Felder kann eine der folgenden, speziellen Zeichenketten auftauchen:

    Zeichenkette    Bedeutung
    ------------    ---------
    @reboot    Einmal beim Systemstart ausführen.
    @yearly    Einmal pro Jahr ausführen, »0 0 1 1 *«.
    @annually    (identisch zu @yearly)
    @monthly    Einmal pro Monat ausführen, »0 0 1 * *«.«
    @weekly    Einmal pro Woche ausführen, »0 0 * * 0«.
    @daily    Einmal pro Tag ausführen, »0 0 * * *«.
    @midnight    (identisch zu @daily)
    @hourly    Einmal pro Stunde ausführen »0 * * * *«.

Bitte beachten Sie, dass der Systemstart, soweit es @reboot betrifft, der Zeitpunkt ist, zu dem der cron(8)-Daemon startet. Dies mag insbesondere früher als der Start einiger Daemons oder anderer Einrichtungen sein. Dies geschieht aufgrund der Systemstartreihenfolge der Maschine.

BEISPIEL FÜR EINE CRON-DATEI

Nachfolgend ein Beispiel einer Benutzer-Crontab-Datei.

# /bin/bash anstatt der Vorgabe /bin/sh zur Ausführung von Programmen verwenden
SHELL=/bin/bash
# sämtliche Ausgaben an »paul« schicken, egal wessen Crontab dies ist
MAILTO=paul
#
# jeden Tag fünf Minuten nach Mitternacht ausführen
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# um 14:15 am ersten Tag jedes Monats ausführen — Ausgabe wird an Paul geschickt
15 14 1 * *     $HOME/bin/monthly
# um 22 Wochentags ausführen, Joe ärgern
0 22 * * 1-5    mail -s "Es ist 22:00 Uhr" joe%Joe,%%Wo sind Deine Kinder?%
23 0-23/2 * * * echo "23 Minutes nach Mitternacht, 2 Uhr, 4 …, jeden Tag ausführen"
5 4 * * sun     echo "5 Minuten nach 4 Uhr Sonntags ausführen"
0 */4 1 * mon   echo "alle vier Stunden am 1. und an jedem Montag ausführen"
0 0 */2 * sun   echo "um Mitternacht an jedem Sonntag, der an einem ungeraden Tag ist, ausführen"
# An jedem zweiten Samstag des Monats ausführen
0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2. Samstag"

Alle obigen Beispiele führen nicht-interaktive Programme aus. Falls Sie ein Programm ausführen möchten, das mit dem Benutzer in Wechselspiel auf dem Desktop tritt, müssen Sie sicherstellen, dass die geeignete Umgebungsvariable DISPLAY gesetzt ist.

# Führt täglich um 10:00 Uhr ein Programm und eine Benachrichtigung aus
0 10 * * *  $HOME/bin/program | DISPLAY=:0 notify-send "Programmausführung" "$(cat)"

BEISPIEL FÜR EINE CRON-DATEI DES SYSTEMS

Nachfolgend ein Beispiel des Inhaltes einer regulären, systemweiten Crontab-Datei. Anders als eine Benutzer-Crontab hat diese Datei ein Benutzernamenfeld, wie dies von /etc/crontab verwandt wird.

# /etc/crontab: systemweite Crontab
# Anders als alle Crontabs müssen Sie nicht den Befehl »crontab«
# ausführen, um die neue Version zu installieren, wenn Sie diese
# Datei und Dateien in /etc/cron.d bearbeiten. Diese Dateien haben
# auch ein Benutzernamenfeld, was sonst keine andere Crontab hat.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Beispiel für Auftragsdefinition:
# .---------------- Minute (0 - 59)
# |  .------------- Stunde (0 - 23)
# |  |  .---------- Tag des Monats (1 - 31)
# |  |  |  .------- Monat (1 - 12) ODER jan,feb,mar,apr …
# |  |  |  |  .---- Tag der Woche (0 - 6) (Sonntag=0 oder 7) ODER sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# m h Tag Mon TdW Benutzer	Befehl
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 )
#

Beachten Sie, dass alle systemweiten Aufgaben standardmäßig zwischen 6 und 7 Uhr laufen werden. Falls das System zu diesem Zeitpunkt nicht eingeschaltet ist, werden nur die stündlichen Aufgaben ausgeführt, außer die obigen Vorgaben werden geändert.

SIEHE AUCH
cron(8), crontab(1)

ERWEITERUNGEN
Bei der Angabe des Tages der Woche werden sowohl Tag 0 als auch Tag 7 als Sonntag betrachtet. BSD und AT&T scheinen sich darüber uneinig zu sein.

Listen und Bereiche können im gleichen Feld simultan existieren. »1-3,7-9« würde von AT&T- und BSD-Cron abgelehnt — sie würden NUR »1-3« oder »7,8,9« sehen wollen.

Bereiche können »Schritte« enthalten, daher ist »1-9/2« identisch zu »1,3,5,7,9«.

Monate oder Tage der Woche können durch ihren englischen Namen angegeben werden.

In der Crontab können Umgebungsvariablen gesetzt werden. In BSD und AT&T ist die an Kindprozesse übergebene Umgebung im Prinzip die von /etc/rc.

Die Ausgabe von Befehlen wird an den Eigentümer der Crontab per E-Mail gesandt (BSD kann dies nicht), kann an eine vom Eigentümer verschiedene Person per E-Mail gesandt werden (SysV kann dies nicht) oder diese Funktionalität kann ausgeschaltet werden und es wird überhaupt keine E-Mail gesandt (SysV kann dies auch nicht).

Alle der »@«-Befehle, die an Stelle der ersten fünf Felder auftauchen können, sind Erweiterungen.

EINSCHRÄNKUNGEN
Der Damon cron läuft mit einer definierte Zeitzone. Derzeit werden keine benutzerbezogenen Zeitzonen unterstützt. Sämtliche Aufgaben (sowohl vom System als auch den Benutzern) werden basierend auf der konfigurierten Zeitzone ausgeführt. Selbst wenn der Benutzer die Umgebungsvariable TZ in seiner crontab festlegt, wird dies nur die in der Crontab ausgeführten Befehle betreffen, nicht die Ausführung der Programme der Crontab selbst.

POSIX legt fest, dass die Felder »Tag des Monats« und »Tag der Woche« beide auf die aktuelle Zeit passen, falls einer von ihnen ein * ist. Allerdings prüft diese Implementierung nur, ob das erste Zeichen ein * ist. Daher wird »0 0 */2 * sun« jeden Sonntag an einem ungeraden Tag ausgeführt, während der POSIX-Standard verlangt, dass er an jedem Sonntag und an jedem ungeraden Tag ausgeführt würde.

Die Syntax von crontab ermöglicht es nicht, alle möglichen denkbaren Perioden zu definieren. Beispielsweise ist es nicht offensichtlich, wie der letzte Arbeitstag eines Monats definiert werden kann. Um einen Auftrag zu einer Zeit auszuführen, die nicht mit der Syntax von crontab definiert werden kann, ist es am besten, dass das Programm selbst die Datums- und Zeitinformation prüft und die Ausführung nur fortsetzt, falls die Periode die gewünschte ist.

Falls das Programm die Überprüfung nicht selbst durchführen kann, wird ein umhüllendes Skript notwendig. Nützliche Werkzeuge hierfür sind ncal(1) or calendar(1). Um ein Programm beispielsweise am letzten Samstag jedes Monats auszuführen, könnten Sie folgenden einhüllenden Code verwenden:

0 4 * * Sat   [ "$(date +\%e)" = "$(LANG=C ncal | sed -n 's/^Sa .* \([0-9]\+\) *$/\1/p')" ] && echo "Last Saturday" && auszuführendes_Programm

DIAGNOSE
Cron verlangt, dass jeder Eintrag in einer Crontab mit einem Zeilenumbruchzeichen endet. Falls dem letzten Eintrag ein Zeilenumbruch fehlt (d.h. sie mit EOF beendet ist), wird Cron die Crontab als (zumindestens teilweise) defekt betrachten. Es wird eine Warnung ins Systemprotokoll geschrieben.

AUTOR
Paul Vixie <paul@vix.com> ist der Autor von cron und der ursprüngliche Verfasser dieser Handbuchseite. Diese Handbuchseite wurde für Debian von Steve Greenland, Javier Fernandez-Sanguino, Christian Kastner und Christian Pekeler angepasst.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer (debian-l10n-german@lists.debian.org).