crontab.run

Erklärung des crontab-Befehls

Der Cron-Daemon (crond) ist ein Hintergrunddienst auf Unix-Betriebssystemen, der geplante Befehle ausführt. Er liest die Konfiguration aus Crontab-Dateien (Cron-Tabellen), die festlegen, wann und wie oft jeder Befehl ausgeführt werden soll.

Syntax

Der crontab-Befehl verwaltet die Crontab-Dateien jedes Benutzers:

crontab [-u user] [-l | -r | -e | -i] [file]

Optionen

-e
Bearbeitet den Crontab des aktuellen Benutzers im Standard-Editor ($VISUAL oder $EDITOR). Der neue Crontab wird nach dem Schließen des Editors installiert.
-l
Zeigt den Crontab des aktuellen Benutzers auf der Standardausgabe an.
-r
Entfernt den Crontab des aktuellen Benutzers vollständig.
-i
Fordert vor dem Entfernen eine Bestätigung an (verwendet mit -r).
-u user
Arbeitet mit dem Crontab des angegebenen Benutzers statt dem eigenen. Erfordert Root-Rechte.
file
Installiert den Crontab aus der angegebenen Datei. Verwenden Sie - für die Standardeingabe.

Crontab-Dateiformat

Jede Zeile in einer Crontab-Datei ist entweder eine Umgebungsvariablen-Zuweisung, ein Kommentar (beginnend mit #) oder ein Cron-Job mit diesem Format:

┌───────────── Minute (0–59)
│ ┌───────────── Stunde (0–23)
│ │ ┌───────────── Tag des Monats (1–31)
│ │ │ ┌───────────── Monat (1–12 oder JAN–DEC)
│ │ │ │ ┌───────────── Wochentag (0–6 oder SUN–SAT)
│ │ │ │ │
* * * * *  auszuführender Befehl

Feldoperatoren

* (asterisk)
Entspricht jedem möglichen Wert des Feldes.
, (comma)
Gibt eine Liste von Werten an. Beispiel: 1,15 im Feld Tag des Monats bedeutet den 1. und 15.
- (hyphen)
Definiert einen inklusiven Bereich. Beispiel: 9-17 im Stundenfeld bedeutet jede Stunde von 9 bis 17.
/ (slash)
Definiert einen Schritt. Beispiel: */10 im Minutenfeld bedeutet alle 10 Minuten. Kann mit einem Bereich kombiniert werden: 1-30/5.

Spezielle Zeichenketten

Anstelle der fünf Zeitfelder können Sie eine dieser Kurzformen verwenden:

StringEquivalent
@yearly / @annually0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily / @midnight0 0 * * *
@hourly0 * * * *
@rebootRun once at startup

Umgebungsvariablen

Am Anfang einer Crontab-Datei können Umgebungsvariablen gesetzt werden. Die gebräuchlichsten sind:

SHELL
Die Shell, die zum Ausführen von Befehlen verwendet wird (Standard: /bin/sh).
PATH
Der Suchpfad für Befehle. Der Standard-PATH von Cron ist minimal (normalerweise /usr/bin:/bin), verwenden Sie daher immer absolute Pfade oder setzen Sie PATH explizit.
MAILTO
Wohin die Befehlsausgabe gesendet wird. Auf "" setzen, um E-Mails zu unterdrücken. Standardmäßig wird die Ausgabe an den Crontab-Besitzer gesendet.
CRON_TZ
Setzt die Zeitzone für den Crontab (nicht auf allen Systemen unterstützt). Ohne diese Einstellung verwendet Cron die Systemzeitzone.
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]

*/5 * * * * /home/user/scripts/backup.sh

System-Crontab vs. Benutzer-Crontab

Benutzer-Crontabs (bearbeitet mit crontab -e) haben fünf Zeitfelder plus den Befehl. Der System-Crontab (/etc/crontab) und Dateien in /etc/cron.d/ haben ein zusätzliches Feld zwischen den Zeitfeldern und dem Befehl: den Benutzernamen, unter dem der Befehl ausgeführt wird.

Beispiel eines System-Crontab:

# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow user    command
*/15 *  *   *   *   root    /usr/local/bin/system-check.sh
0    2  *   *   *   backup  /usr/local/bin/nightly-backup.sh

Häufige Fallstricke

% (percent sign)

Das Prozentzeichen (%) hat in Crontab eine besondere Bedeutung: Es wird in einen Zeilenumbruch umgewandelt, und alles nach dem ersten % wird als Standardeingabe an den Befehl gesendet. Um ein literales % zu verwenden, maskieren Sie es mit \%.

# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"

# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"

PATH

Cron wird mit einem minimalen PATH ausgeführt. Skripte, die auf Befehle in /usr/local/bin oder anderen Verzeichnissen angewiesen sind, sollten absolute Pfade verwenden oder PATH am Anfang des Crontab setzen.

Day-of-month + day-of-week

Wenn sowohl Tag des Monats als auch Wochentag eingeschränkt sind (nicht *), führt Cron den Befehl aus, wenn eines der Felder zutrifft (ODER-Logik), nicht wenn beide zutreffen. Beispiel: 0 0 1 * 5 wird um Mitternacht am 1. jedes Monats UND jeden Freitag ausgeführt.

Timezone

Cron verwendet standardmäßig die Systemzeitzone. Wenn Ihr Server in UTC ist, Sie aber Jobs in einer lokalen Zeitzone ausführen möchten, verwenden Sie CRON_TZ (wo unterstützt) oder rechnen Sie die Zeiten manuell um.

Output and logging

Standardmäßig sendet Cron jede Ausgabe (stdout und stderr) an den Crontab-Besitzer. Um einen Job stumm zu schalten, leiten Sie die Ausgabe um: command > /dev/null 2>&1. Um die Ausgabe zu protokollieren, leiten Sie in eine Datei um: command >> /var/log/myjob.log 2>&1.

# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1

# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1

Praktische Beispiele