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.
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
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.
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
Neben den benutzerspezifischen Crontabs gibt es systemweite Verzeichnisse, in denen Skripte nach Intervall einsortiert werden können:
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
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
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.
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
Für die häufigsten Intervalle bietet Cron Abkürzungen, die statt der fünf Zeitfelder verwendet werden können:
| Kürzel | Bedeutung | Entspricht |
|---|---|---|
| @reboot | Einmal beim Systemstart | – |
| @hourly | Jede volle Stunde | 0 * * * * |
| @daily | Täglich um Mitternacht | 0 0 * * * |
| @weekly | Wöchentlich (Sonntag, 0:00) | 0 0 * * 0 |
| @monthly | Monatlich (1. des Monats, 0:00) | 0 0 1 * * |
| @yearly | Jährlich (1. Januar, 0:00) | 0 0 1 1 * |
| Aufgabe | Befehl |
|---|---|
| Crontab bearbeiten | crontab -e |
| Crontab anzeigen | crontab -l |
| Crontab löschen | crontab -r |
| Crontab eines Benutzers anzeigen | sudo 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 sichern | crontab -l > ~/crontab-backup.txt |