Scroll to navigation

CRONTAB(5) File Formats Manual 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.

Note that comments on the same line as cron commands are not interpreted as comments in the cron sense, but are considered part of the command and passed to the shell. This is similarly true for comments on the same line as environment variable settings.

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 alle folgenden und nicht am Anfang stehenden Leerraumzeichen 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ührenden oder abschließenden Leerraum zu erhalten. Um eine leere Variable zu definieren, müssen Sie Anführungszeichen verwenden.

The value string is not parsed for environmental substitutions or replacement of variables or tilde(~) expansion, thus lines like


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

wird nicht wie erwartet funktionieren. Auch das wird nicht funktionieren:


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

Für die im letzten Wert definierten Variablen wird keine Ersetzung vorgenommen.

Eine Reihe von Umgebungsvariablen werden durch den cron(8)-Daemon automatisch eingerichtet. SHELL wird auf »/usr/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.

(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 prüft cron(8) auch die Variable MAILTO, falls eine E-Mail als Ergebnis der Ausführung eines Befehls in einer bestimmten Crontab gesendet werden muss. Falls MAILTO definiert (und nicht leer) ist, werden E-Mails an die angegebene Adresse gesendet. Falls MAILTO definiert, aber leer ist (MAILTO=""), wird keine E-Mail gesendet. Diese Option ist nützlich, falls Sie »/usr/bin/mail« anstatt von »/usr/lib/sendmail« als Ihr E-Mail-Versandprogramm verwenden. Beachten Sie, dass »/usr/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 »root« genutzt.

The format of a cron command is very much the V7 standard, with a number of upward-compatible extensions. Each line has five time and date fields, followed by a command, followed by a newline character ('\n'). The system crontab (/etc/crontab) uses the same format, except that the username for the command is specified after the time and date fields and before the command. The fields may be separated by spaces or tabs. The maximum permitted length for the command field is 998 characters.

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«). cron(8) prüft Cron-Einträge einmal pro Minute. Die Zeit- und Datum-Felder sind folgende:

Feld Zulässige Werte
----- --------------
Minute 0-59
Stunde 0-23
Tag des Monats 0-31
Monat 0-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.

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 zum Zeilenumbruch oder zum Zeichen »%« wird durch »/usr/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 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 16:30 Uhr am 1. und am 15. jedes Monats sowie jeden Freitag ausgeführt wird. Sie können jedoch das gewünschte Ergebnis auch erreichen, indem Sie einen Test zum Befehl hinzufügen (siehe das letzte Beispiel in BEISPIEL FÜR EINE CRON-DATEI nachfolgend).

Anstelle der ersten fünf Felder kann eine der folgenden acht speziellen Zeichenketten erscheinen:

Zeichenkette Bedeutung
------ -------
@reboot Einmal beim Systemstart ausführen.
@yearly Einmal im Jahr ausführen, "0 0 1 1 *".
@annually (gleichbedeutend mit @yearly)
@monthly Einmal im Monat ausführen, "0 0 1 * *".
@weekly Einmal in der Woche ausführen, "0 0 * * 0".
@daily Einmal täglich ausführen, "0 0 * * *".
@midnight (gleichbedeutend mit @daily)
@hourly Einmal pro Stunde ausführen, "0 * * * *".

Please note that startup, as far as @reboot is concerned, is the time when the cron(8) daemon startup. In particular, it may be before some system daemons, or other facilities, were startup. This is due to the boot order sequence of the machine.

BEISPIEL FÜR EINE CRON-DATEI

# use /usr/bin/sh to run commands, no matter what /etc/passwd says
SHELL=/usr/bin/sh
# mail any output to `paul', no matter whose crontab this is
MAILTO=paul
#
# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every Sunday"
0 */4 1 * mon   echo "run every 4th hour on the 1st and on every Monday"
0 0 */2 * sun   echo "run at midn on every Sunday that's an uneven date"
# Run on every second Saturday of the month
0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"
# Same thing, efficient too:
0 4 * * * Sat   d=$(date +e) && test $d -ge 8 -a $d -le 14 && echo "2nd Saturday"
#Execute early the next morning following the first
#Thursday of each month
57 2 * * 5 case $(date +d) in 0[2-8]) echo "After 1st Thursday"; esac

Alle der vorstehenden Beispiele führen nicht-interaktive Programme aus. Sollten Sie ein Programm ausführen wollen, das mit der Arbeitsumgebung des Benutzers interagiert, dann müssen Sie sicherstellen, dass die Umgebungsvariable DISPLAY korrekt gesetzt ist.

# Execute a program and run a notification every day at 10:00 am
0 10 * * *  $HOME/bin/program | DISPLAY=:0 notify-send "Program run" "$(cat)"

BEISPIEL FÜR EINE SYSTEM-CRON-DATEI

The following lists the content of a regular system-wide crontab file. Unlike a user's crontab, this file has the username field, as used by /etc/crontab.

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d.  These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# m h dom mon dow user	command
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 )
#

Note that all the system-wide tasks will run, by default, from 6 am to 7 am. In the case of systems that are not powered on during that period of time, only the hourly tasks will be executed unless the defaults above are changed.

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

All of the `@' commands that can appear in place of the first five fields are extensions.

EINSCHRÄNKUNGEN

The cron daemon runs with a defined timezone. It currently does not support per-user timezones. All the tasks: system's and user's will be run based on the configured timezone. Even if a user specifies the TZ environment variable in his crontab this will affect only the commands executed in the crontab, not the execution of the crontab tasks themselves. If one wants to specify a particular timezone for crontab tasks, one may check the date in the child script, for example:


# m h dom mon dow command
SHELL=/usr/bin/sh
TZ=UTC
0 * * * * [ "$(date +\%R)" = 00:00 ] && ein_Skript_ausführen

POSIX specifies that the day of month and the day of week fields both need to match the current time if either of them is a *. However, this implementation only checks if the first character is a *. This is why "0 0 */2 * sun" runs every Sunday that's an uneven date while the POSIX standard would have it run every Sunday and on every uneven date.

The crontab syntax does not make it possible to define all possible periods one can imagine. For example, it is not straightforward to define the last weekday of a month. To have a task run in a time period that cannot be defined using crontab syntax, the best approach would be to have the program itself check the date and time information and continue execution only if the period matches the desired one.

Falls das Programm die Prüfungen nicht selbst ausführen kann, dann ist ein Wrapper-Skript erforderlich. Hilfreiche Werkzeuge, die für die Datumsanalyse verwendet werden können, sind ncal(1) oder calendar(1). Um beispielsweise am letzten Samstag jedes Monats ein Programm auszuführen, könnten Sie folgenden Wrapper-Code verwenden:

0 4 * * Sat   [ "$(date +\%e)" = "$(LANG=de ncal | sed -n 's/^Sa .* \([0-9]\+\) *$/\1/p')" ] && echo "Letzter Samstag" && 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, Christian Pekeler und Georges Khaznadar 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 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.

19. April 2010 4th Berkeley Distribution