CRONTAB(5)

BEZEICHNUNG
crontab - zur Planung der Ausführung von Programmen verwendete Dateien

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

Leere Zeilen, vorangestellte Leerzeichen und Tabulatoren werden ignoriert. Zeilen, deren erstes Zeichen (nach möglichem Leerraum) eine Raute (#) ist, sind Kommentare und werden nicht verarbeitet. 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 Variablenzuweisungen der Umgebung erlaubt.

Eine aktive Zeile in einer Crontab ist entweder eine Umgebungseinstellung oder ein Cron-Befehl. Eine Umgebungseinstellung hat die folgende Form:

   Name = Wert

Dabei ist Leerraum um das Gleichheitszeichen (=) herum optional und jeder folgende und nicht am Anfang stehende Leerraum in Wert wird als Teil des Name zugewiesenen Wertes betrachtet. Der Wert kann in einfache oder doppelte (aber zueinander passende) englische Anführungszeichen eingeschlossen werden, um führenden oder abschließenden Leerraum zu erhalten.

Eine Reihe von Umgebungsvariablen werden durch den cron(8)-Daemon automatisch eingerichtet. SHELL wird auf »/bin/sh« gesetzt und LOGNAME und HOME werden aus der /etc/passwd-Zeile des Eigentümers der Crontab gesetzt. HOME und SHELL können durch Einstellungen in der Crontab außer Kraft gesetzt werden; für »LOGNAME« ist dies nicht möglich.

(Beachten Sie: Die Variable LOGNAME wird auf BSD-Systemen manchmal USER genannt und wird automatisch eingerichtet).

Zusätzlich zu LOGNAME, HOME und SHELL prüft cron(8) auch die Variable MAILTO, falls eine E-Mail als Ergebnis der Ausführung eines Befehls in einer bestimmten Crontab gesandt werden muss. Falls MAILTO definiert (und nicht leer) ist, werden E-Mails an die angegebene Adresse gesandt. Falls MAILTO definiert, aber leer ist (MAILTO=""), wird keine E-Mail gesandt. Diese Option ist nützlich, falls Sie »/bin/mail« anstatt von »/usr/lib/sendmail« als Ihr E-Mail-Versandprogramm verwenden. Beachten Sie, dass »/bin/mail« keine Aliase unterstützt und UUCP normalerweise seine E-Mail nicht liest. Falls MAILFROM definiert (und nicht leer) ist, wird es als Umschlagsendeadresse verwandt, andernfalls wird der Benutzername des aufrufenden Benutzers genutzt. Diese Variable wird auch von der Prozessumgebung von crond(8) geerbt.

(Achtung: Sowohl MAILFROM als auch MAILTO werden expandiert, so dass das Setzen beider Variablen im folgenden Beispiel wie erwartet funktioniert: MAILFROM=cron-$USER@cron.com ($USER wird durch den Systembenutzer ersetzt)).

Standardmäßig sendet Cron eine E-Mail mit der Kopfzeile »Content-Type:« auf »text/plain« mit dem Parameter »charset=« auf die »charmap/codeset« der Locale, in der crond(8) gestartet wurde, gesetzt, d.h. entweder der Vorgabe-System-Locale, falls keine LC_*-Umgebungsvariable gesetzt sind, oder der in den LC_+-Umgebungsvariablen angegebenen Locale (siehe locale(7)). Für das Versenden der Ausgabe von Cron-Aufträgen können verschiedene Zeichenkodierungen durch Setzen der Variablen CONTENT_TYPE und CONTENT_TRANSFER_ENCODING in einer Crontab auf die korrekten Werte der E-Mail-Kopfzeilen gleichen Namens verwandt werden.

Die Variable CRON_TZ legt die für die Cron-Tabelle spezifische Zeitzone fest. Der Benutzer sollte in die Tabelle eine Uhrzeit entsprechend der angegebenen Zeitzone eintragen. Die für das Schreiben in eine Protokolldatei verwandte Zeit wird von der lokalen Zeitzone übernommen, in der der Daemon läuft.

Die Umgebungsvariable MLS_LEVEL stellt Unterstützung für mehrfache auftragsbezogene SELinux-Sicherheitskontexte in der gleichen Crontab bereit. Standardmäßig werden Cron-Aufträge in dem Vorgabe-SELinux-Kontext des Benutzers, der die Crontab-Datei erstellte, ausgeführt. Werden mehrfache Sicherheitsstufen und -rollen verwandt, mag dies nicht ausreichen, da der gleiche Benutzer sich in verschiedenen Rollen oder in verschiedenen Sicherheitsstufen befinden könnte. Für weitere Informationen über Rollen und SELinux-MLS/MCS, siehe selinux(8) und das nachfolgend in diesem Text erwähnte Beispiel. Sie können die Variable MLS_LEVEL auf die SELinux-Sicherheitskontextzeichenkette setzen, die den konkreten SELinux-Sicherheitskontext angibt, in dem der Auftrag ausgeführt werden soll. crond wird dann den Ausführungskontext der Aufträge setzen, die auf die Spezifikation des konkreten Sicherheitskontextes passen. Für weitere Informationen siehe die Option »-s« von crontab(1).

Die Variable RANDOM_DELAY ermöglicht das Verzögern des Startens von Aufträgen um eine zufällige Anzahl von Minuten, wobei die obere Grenze durch diese Variable festgelegt wird. Der zufällige Skalierungsfaktor wird durch den Cron-Daemon beim Starten ermittelt, so dass er für die gesamte Laufzeit des Daemons konstant bleibt.

Das Format eines Cron-Befehls ist dem V7-Standard ähnlich, mit einer Reihe von vorwärtskompatiblen Erweiterungen. Jede Zeile hat fünf Zeit-und-Datum-Felder, gefolgt von einem Benutzernamen (falls dies die system-Crontab-Datei ist), und gefolgt von einem Befehl. Befehle werden durch cron(8) ausgeführt, wenn die Felder »Minute«, »Stunde« und »Monat des Jahres« mit der aktuellen Zeit übereinstimmen und mindestens eines der zwei »Tag«-Felder (»Tag des Monats« oder »Tag der Woche«) mit der aktuellen Zeit übereinstimmt (siehe nachfolgenden »Hinweis«).

Beachten Sie, dass nicht existierende Zeiten, wie »fehlende Stunden« bei der Umstellung auf Sommer-/Winterzeit, niemals übereinstimmen werden, wodurch Aufträge, die während dieser »fehlenden Zeiten« eingeplant waren, nicht ausgeführt werden. Auf ähnliche Weise werden Zeiten, die mehrfach existieren (wieder aufgrund der Sommer-/Winterzeitumstellung) dazu führen, dass Aufträge zweimal ausgeführt werden.

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 Namen, siehe unten)
    Wochentag    0-7 (0 oder 7 ist Sonntag, oder Namen verwenden)

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. Die erste Zahl muss kleiner oder gleich der zweiten sein.

Es ist möglich, den Ausführungszeitpunkt aus einem Bereich zufällig zu wählen. Eine Zufallszahl wird aus einem durch zwei durch eine Tilde getrennten Zahlen angegebenen Bereich ausgewählt. Der Bereich schließt dabei die beiden angegebenen Zahlen ein. Beispielsweise wählt »6~15« für einen »Minuten«-Eintrag eine zufällige Zahl von 6 bis 15. Die Zufallszahl wird ausgewählt, wenn die Crontab ausgewertet wird. Die erste Zahl muss kleiner als oder gleich der zweiten Zahl sein. Sie können eine oder auch beide Zahlen weglassen, wenn Sie einen Bereich angeben. Beispielsweise wählt »~« für einen »Minuten«-Eintrag eine zufällige Zahl von 0 bis 59.

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. Folgt einem Bereich eine »/<Anzahl>«, so legt dies die Schrittweite durch den Bereich fest. Beispielsweise kann »0-23/2« im Feld »Stunden« verwandt werden, um festzulegen, dass der Befehl jede zweite Stunde ausgeführt werden soll (die Alternative im V7-Standard ist »0,2,4,6,8,10,12,14,16,18,20,22«). Schrittwerte sind auch nach einem Stern erlaubt, so dass Sie für die Ausführung eines Befehls alle zwei Stunden auch »*/2« verwenden können. Bitte beachten Sie, dass Schritte innerhalb des Feldes ausgewertet werden, auf das sie angewendet werden. Im Stundenfeld bedeutet beispielsweise »*/23«, dass der Auftrag in der Stunde 0 und der Stunde 23 innerhalb eines Kalendertages ausgeführt wird. In »ANMERKUNGEN« wird beschrieben, wie Sie das umgehen können.

Für die Felder »Monat« und »Tag der Woche« können auch Namen verwandt werden. Verwenden Sie die ersten drei Buchstaben des konkreten englischen Namens des Tages oder Monats (Groß-/Kleinschreibung ist egal). Bereiche und Liste von Namen sind erlaubt. Beispiele: »mon,wed,fri«, »jan-mar«.

Falls die UID des Eigentümers 0 (root) ist, kann das erste Zeichen des Crontab-Eintrags »-« sein. Dies verhindert den Eintrag im Syslog für den ausgeführten Befehl.

Das »sechste« Feld (der Rest der Zeile) legt den auszuführenden Befehl fest. Der gesamte Befehlsanteil der Zeile bis zum Zeilenumbruch oder zum Zeichen »%« wird durch »/bin/sh« oder die durch die Variable SHELL in der Cron-Datei festgelegte Shell ausgeführt. Ein »%«-Zeichen im Befehl wird in einen Zeilenumbruch umgewandelt, außer es wird mit einem Rückwärtsschrägstrich (\) geschützt, und sämtliche Daten nach dem ersten »%« werden dem Befehl als Standardeingabe übergeben.

Hinweis: Der Tag der Befehlsausführung kann in den folgenden zwei Feldern festgelegt werden: »Tag des Monats« und »Tag der Woche«. Falls beide Felder eingeschränkt sind (d.h. nicht das Zeichen »*« enthalten), 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 16:30 Uhr am 1. und am 15. jedes Monats sowie jeden Freitag ausgeführt wird.

Die Syntax einer Crontab-Datei kann vor der Installation mit der Option -t getestet werden. In crontab(1) finden Sie Details hierzu.

BEISPIEL FÜR EINE CRON-DATEI
# /bin/sh verwenden, um Befehle auszuführen, unabhängig davon, was /etc/passwd angibt
SHELL=/bin/sh
# sämtliche Ausgaben an »paul« schicken, unabhängig davon, wessen Crontab dies ist
MAILTO=paul
#
CRON_TZ=Japan
# jeden Tag fünf Minuten nach Mitternacht ausführen
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# um 14:15 Uhr am ersten Tag jedes Monats ausführen -- Ausgabe wird an Paul geschickt
15 14 1 * *     $HOME/bin/monthly
# Wochentags um 22 Uhr ausgeführt, Joe ärgern
0 22 * * 1-5    mail -s "Es ist 22 Uhr, " joe%Joe,%%Wo sind Deine Kinder?%
23 0-23/2 * * * echo "ausgeführt 23 Minuten nach Mitternacht, 2 Uhr, 4 Uhr, …, jeden Tag"
5 4 * * sun     echo "ausgeführt um 5 nach 4 Uhr jeden Sonntag"

Aufträge in /etc/cron.d/
Die in cron.d und /etc/crontab aufgeführten Aufträge sind Systemaufträge, die normalerweise für mehr als einen Benutzer verwandt werden und daher ein Benutzername benötigt wird. MAILTO in der ersten Zeile ist optional.

BEISPIEL FÜR EINEN AUFTRAG IN /etc/cron.d/job
#als root anmelden
#Aufträge mit dem bevorzugten Editor (z.B. vim) erstellen
MAILTO=root
* * * * * root touch /tmp/file

ANMERKUNGEN
Wie oben angemerkt agieren Schrittwerte nur innerhalb des Zeitraums, zu dem sie gehören. Beispielsweise führt die Angabe von »0/35« im Minutenfeld eines Crontab-Eintrags nicht dazu, dass der Eintrag alle 35 Minuten ausgeführt wird; er wird stattdessen zwei Mal pro Stunde, um 0 und 35 Minuten nach der Stunde, ausgeführt. Für eine granularere Steuerung können Sie etwas der folgenden Art angeben:
* * * * * if [ $(expr \( $(date +%s) / 60 \) % 58) = 0 ]; then echo dies wird alle 58 Minuten ausgeführt; fi
0 * * * * if [ $(expr \( $(date +%s) / 3600 \) % 23) = 0 ]; then echo dies wird alle 23 Stunden zur vollen Stunde ausgeführt; fi
Passen Sie dies nach Bedarf an, falls Ihr Befehl date(1) nicht »+%s« als Formatzeichenkennzeichner zur Ausgabe des aktuellen UNIX-Zeitstempels akzeptiert.

SELinux mit mehrstufiger Sicherheit (MLS)
Es ist wichtig, dass in einer Crontab die Sicherheitsstufe mittels crontab -s oder durch Angabe der benötigten Stufe als erste Zeile in der Crontab festgelegt wird. Jede Stufe wird in /etc/selinux/targeted/seusers spezifiziert. Bei der Verwendung der Crontab im MLS-Modus ist es besonders wichtig, dass:
- die tatsächliche Rolle geprüft/geändert wird,
- die korrekte Rolle für das Verzeichnis gesetzt wird, das für die Ein-/Ausgabe verwandt wird.

BEISPIEL FÜR SELINUX-MLS
# als root anmelden
newrole -r sysadm_r
mkdir /tmp/SystemHigh
chcon -l SystemHigh /tmp/SystemHigh
crontab -e
# in Crontab-Datei schreiben
MLS_LEVEL=SystemHigh
0-59 * * * * id -Z > /tmp/SystemHigh/crontest

DATEIEN
/etc/crontab Haupt-System-Crontab-Datei. /var/spool/cron/ ein Verzeichnis zum Speichern von durch Benutzer definierten Crontabs. /etc/cron.d/ ein Verzeichnis zum Speichern von System-Crontabs.

SIEHE AUCH
cron(8), crontab(1)

ERWEITERUNGEN
Es werden folgende, die Zeit festlegenden »Spitznamen« unterstützt, die die fünf anfänglichen Zeit- und Datumsfelder ersetzen und denen das Zeichen »@« vorangestellt ist:

@reboot    :    Einmalig nach dem Neustart ausgeführt.
@yearly    :    Einmal jährlich ausgeführt, d.h.    »0 0 1 1 *«.
@annually  :    Einmal jährlich ausgeführt, d.h.    »0 0 1 1 *«.
@monthly   :    Einmal monatlich ausgeführt, d.h.   »0 0 1 * *«.
@weekly    :    Einmal wöchentlich ausgeführt, d.h. »0 0 * * 0«.
@daily     :    Einmal täglich ausgeführt, d.h.     »0 0 * * *«.
@hourly    :    Einmal stündlich ausgeführt, d.h.   »0 * * * *«.

WARNUNGEN
crontab-Dateien müssen normale Dateien oder Symlinks darauf sein, sie dürfen nicht ausführbar oder für jemanden anderes als den Eigentümer schreibbar sein. Diese Anforderung kann mit der Option -p auf der Crond-Befehlszeile außer Kraft gesetzt werden. Falls Inotify-Unterstützung verwandt wird, werden Änderungen in den per Symlink eingebundenen Crontabs durch den Cron-Daemon nicht automatisch bemerkt. Der Cron-Daemon muss ein SIGHUP-Signal empfangen, um die Crontabs neu zu laden. Dies ist eine Einschränkung des Inotify-APIs.

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 (vixie@isc.org)

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