Snippet

Cronjob einrichten unter Linux (Crontab)

Wer Aufgaben auf einem Linux-Server automatisieren will, kommt an Cron nicht vorbei.

von Oli Feiler · 27. Januar 2017

Ob regelmäßige Backups, Datenbank-Bereinigungen oder der Versand automatischer Reports – ein Cronjob erledigt das zuverlässig im Hintergrund, ohne dass jemand manuell eingreifen muss.

Das zentrale Werkzeug dafür ist die Crontab (kurz für „Cron Table"): eine Konfigurationsdatei, in der festgelegt wird, welcher Befehl wann und in welchem Intervall ausgeführt werden soll. Die Syntax wirkt auf den ersten Blick kryptisch – ist aber schnell durchschaut, wenn man das Schema einmal verstanden hat.

Crontab bearbeiten

Jeder Benutzer auf dem System hat eine eigene Crontab. Bearbeitet wird sie mit:

            crontab -e
        

Beim ersten Aufruf fragt das System nach dem bevorzugten Editor (z. B. nano oder vi). Die Datei wird nach dem Speichern automatisch aktiviert – ein Neustart von Cron ist nicht nötig.

Für systemweite Cronjobs, die als root laufen sollen:

            sudo crontab -e
        

Die Crontab-Syntax

Jede Zeile in der Crontab folgt dem gleichen Schema – fünf Zeitfelder, gefolgt vom auszuführenden Befehl:

            ┌───────────── Minute (0–59)
│ ┌─────────── Stunde (0–23)
│ │ ┌───────── Tag im Monat (1–31)
│ │ │ ┌─────── Monat (1–12)
│ │ │ │ ┌───── Wochentag (0–6, 0 = Sonntag)
│ │ │ │ │
* * * * *  /pfad/zum/befehl
        

Ein Stern (*) bedeutet „jeder mögliche Wert". Wer alle fünf Felder auf Stern lässt, führt den Befehl jede Minute aus.

Häufige Zeitintervalle als Beispiele

Jeden Tag um 3:00 Uhr nachts (typisch für Backups):

            0 3 * * * /usr/local/bin/backup.sh
        

Alle 15 Minuten:

            */15 * * * * /usr/local/bin/check-service.sh
        

Jeden Montag um 8:00 Uhr:

            0 8 * * 1 /usr/local/bin/weekly-report.sh
        

Am 1. jedes Monats um Mitternacht:

            0 0 1 * * /usr/local/bin/monthly-cleanup.sh
        

Alle 6 Stunden:

            0 */6 * * * /usr/local/bin/sync-data.sh
        

Werktags um 9:00 und 17:00 Uhr:

            0 9,17 * * 1-5 /usr/local/bin/status-check.sh
        

Vorhandene Cronjobs anzeigen

            crontab -l
        

Zeigt alle Cronjobs des aktuellen Benutzers. Für die Cronjobs eines anderen Benutzers (als root):

            sudo crontab -u benutzername -l
        

Systemweite Cronjobs

Neben den benutzerspezifischen Crontabs gibt es systemweite Verzeichnisse, in denen Skripte nach Intervall einsortiert werden können:

  • /etc/cron.hourly/   – stündliche Ausführung
  • /etc/cron.daily/   – tägliche Ausführung
  • /etc/cron.weekly/   – wöchentliche Ausführung
  • /etc/cron.monthly/   – monatliche Ausführung

Skripte, die in einem dieser Verzeichnisse liegen, brauchen keine Crontab-Zeile – sie werden automatisch von anacronoder run-parts aufgerufen. Wichtig: Die Skripte müssen ausführbar sein (chmod +x) und dürfen keinen Punkt im Dateinamen haben (also backup statt backup.sh).

Zusätzlich existiert die Datei /etc/crontab, die wie eine normale Crontab funktioniert, aber ein zusätzliches Feld für den Benutzernamen enthält:

            0 3 * * * root /usr/local/bin/system-backup.sh
        

Ausgabe und Logging

Standardmäßig versucht Cron, die Ausgabe eines Jobs per E-Mail an den jeweiligen Benutzer zu schicken. Auf Servern ohne konfigurierten Mailversand führt das zu Problemen. Besser ist es, die Ausgabe gezielt in eine Logdatei umzuleiten:

            0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
        

>> /var/log/backup.log hängt die Standardausgabe an die Logdatei an.2>&1 leitet auch Fehlermeldungen dorthin um. Wer die Ausgabe komplett unterdrücken will:

            0 3 * * * /usr/local/bin/backup.sh > /dev/null 2>&1
        

Umgebungsvariablen in der Crontab

Cronjobs laufen in einer minimalen Shell-Umgebung – das heißt, viele Umgebungsvariablen, die in einer normalen SSH-Sitzung verfügbar sind, fehlen. Zwei Dinge helfen:

Die PATH-Variable am Anfang der Crontab setzen:

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

0 3 * * * backup.sh
        

Oder im Befehl immer den vollständigen Pfad angeben – sowohl zum Skript als auch zu allen Programmen, die das Skript aufruft.

Häufige Stolperfallen

Cronjob läuft nicht? In den meisten Fällen liegt es an fehlenden Berechtigungen (Skript nicht ausführbar) oder an einer falschen PATH-Variable. Cron loggt seine Aktivitäten in /var/log/syslog (Debian/Ubuntu) bzw. /var/log/cron (RHEL-basiert):

            grep CRON /var/log/syslog
        

Prozent-Zeichen in Befehlen? Cron interpretiert % als Zeilenumbruch. In Befehlen mit Datumsformatierung wie date +%Y-%m-%d muss das Prozentzeichen mit einem Backslash escaped werden: date +%Y-%m-%d.

Crontab versehentlich gelöscht? crontab -r löscht die gesamte Crontab ohne Rückfrage. Wer sich vertippt und statt crontab -e ein crontab -r eingibt, hat ein Problem. Es lohnt sich, eine Sicherungskopie anzulegen:

            crontab -l > ~/crontab-backup.txt
        

Spezielle Zeitkürzel

Für die häufigsten Intervalle bietet Cron Abkürzungen, die statt der fünf Zeitfelder verwendet werden können:

KürzelBedeutungEntspricht
@rebootEinmal beim Systemstart
@hourlyJede volle Stunde0 * * * *
@dailyTäglich um Mitternacht0 0 * * *
@weeklyWöchentlich (Sonntag, 0:00)0 0 * * 0
@monthlyMonatlich (1. des Monats, 0:00)0 0 1 * *
@yearlyJährlich (1. Januar, 0:00)0 0 1 1 *

Kurzreferenz

AufgabeBefehl
Crontab bearbeitencrontab -e
Crontab anzeigencrontab -l
Crontab löschencrontab -r
Crontab eines Benutzers anzeigensudo crontab -u benutzername -l
Cron-Log prüfen (Debian/Ubuntu)grep CRON /var/log/syslog
Cron-Log prüfen (RHEL/Rocky)grep CRON /var/log/cron
Crontab sicherncrontab -l > ~/crontab-backup.txt

Hinweis

Zuletzt aktualisiert am 24. Mai 2026.