Was ist Cron?
Cron ist der klassische Unix-Daemon für zeitgesteuerte Aufgaben — der stille Automatisierer im Hintergrund, der seit den 1970ern läuft und auf jedem Linux-System vorhanden ist. Der Name stammt vom griechischen Chronos (Zeit). Cron liest beim Start und bei Änderungen sogenannte Crontabs (Cron-Tabellen) und führt darin definierte Befehle zu exakt festgelegten Zeitpunkten aus.
Der Daemon selbst heißt je nach Distribution crond (Red Hat/CentOS) oder cron (Debian/Ubuntu). Er wacht im Hintergrund, prüft jede Minute die Crontab-Einträge und startet fällige Jobs als eigene Prozesse.
Läuft dauerhaft im Hintergrund als Systemdienst. Startet automatisch beim Booten.
Textdatei mit Zeitplan-Einträgen. Pro User eine eigene, plus systemweite Varianten.
Minimale Zeitauflösung: 1 Minute. Für Sub-Minuten-Tasks → systemd-timer oder at.
Ergänzung zu Cron für Rechner, die nicht 24/7 laufen — holt verpasste Jobs nach.
systemd.timer Units als Cron-Ersatz — mehr Logging, genauere Zeitsteuerung, Dependencies möglich. Cron bleibt aber das universelle Standardwerkzeug, das überall funktioniert.Syntax & Felder
Jede Zeile in einer Crontab folgt demselben Schema: fünf Zeitfelder, gefolgt vom auszuführenden Befehl. Die Reihenfolge ist unveränderlich und muss auswendig sitzen — sie ist das A und O der Cron-Nutzung.
m h dom mon dow wie in crontab -e angezeigt.| Feld | Name | Wertebereich | Besonderheit |
|---|---|---|---|
| 1 | Minute | 0–59 | 0 = genau zur vollen Minute |
| 2 | Stunde | 0–23 | 0 = Mitternacht |
| 3 | Day of Month | 1–31 | Achtung bei Monaten mit <31 Tagen |
| 4 | Month | 1–12 | Auch Namen: jan–dec |
| 5 | Day of Week | 0–7 | 0 und 7 = Sonntag; auch mon–sun |
dom als auch dow angegeben sind (beide nicht *), führt Cron den Job aus, wenn einer der beiden Bedingungen erfüllt ist — ODER-Logik, nicht UND. Das ist kontraintuitiv und ein häufige Fehlerquelle.Sonderzeichen
Die fünf Zeitfelder unterstützen Sonderzeichen für flexible Zeitangaben. Kombiniert ermöglichen sie nahezu jedes denkbare Intervall.
| Zeichen | Bedeutung | Beispiel | Erklärung |
|---|---|---|---|
| * | Wildcard / Jeder Wert | * * * * * | Jede Minute |
| , | Liste / Mehrere Werte | 0 8,12,18 * * * | Um 8:00, 12:00 und 18:00 Uhr |
| - | Bereich | 0 9-17 * * * | Stündlich von 9 bis 17 Uhr |
| / | Schrittweite | */15 * * * * | Alle 15 Minuten |
| @reboot | Beim Systemstart | @reboot /pfad/script.sh | Einmalig nach jedem Boot |
| @hourly | Stündlich | @hourly /pfad/script.sh | Äquivalent zu 0 * * * * |
| @daily | Täglich Mitternacht | @daily /pfad/script.sh | Äquivalent zu 0 0 * * * |
| @weekly | Wöchentlich | @weekly /pfad/script.sh | Äquivalent zu 0 0 * * 0 (Sonntag) |
| @monthly | Monatlich | @monthly /pfad/script.sh | Äquivalent zu 0 0 1 * * |
| @yearly | Jährlich | @yearly /pfad/script.sh | Äquivalent zu 0 0 1 1 * |
Kombination von Sonderzeichen
Tipp: Online-Tools
Cron-Ausdrücke lassen sich schnell mit Tools wie crontab.guru validieren — gibt den Ausdruck in Klartext aus und zeigt die nächsten Ausführungszeitpunkte.
crontab verwalten
Jeder Linux-User hat seine eigene Crontab, die unabhängig von anderen Usern läuft. Der crontab-Befehl ist das einzige empfohlene Interface dafür — direkte Dateibearbeitung in /var/spool/cron/crontabs/ wird nicht empfohlen, weil Cron die Datei cachen kann.
sudo crontab -e) oder via sudo in einem Script aufgerufen werden — wobei NOPASSWD in /etc/sudoers nötig ist, da kein interaktives Terminal vorhanden ist.Editor konfigurieren
Praxisbeispiele
Cronjobs decken ein breites Spektrum ab — von simplen Backup-Skripten bis hin zu komplexen Wartungsroutinen. Hier die wichtigsten Anwendungsfälle mit vollständigen Einträgen.
Backup-Aufgaben
System-Wartung
Web-Anwendungen / Laravel
Monitoring & Benachrichtigungen
% als Zeilenumbruch interpretiert. Für date +%Y muss es als date +\%Y geschrieben werden — oder das ganze Script in eine separate Datei auslagern, wo % normal funktioniert.Umgebungsvariablen
Einer der häufigsten Fehlerquellen bei Cronjobs: Das Script funktioniert im Terminal, schlägt aber als Cronjob fehl. Der Grund ist fast immer die abgespeckte Cron-Umgebung. Cron startet Jobs mit einer minimalen Shell-Umgebung — kein ~/.bashrc, kein ~/.profile, minimaler $PATH.
| Variable | Funktion | Typischer Wert |
|---|---|---|
| SHELL | Shell für Befehlsausführung | /bin/bash |
| PATH | Suchpfad für ausführbare Dateien | /usr/local/bin:/usr/bin:/bin |
| MAILTO | Empfänger für Cron-Output (leer = kein Mail) | [email protected] oder "" |
| HOME | Home-Verzeichnis des Users | /home/username |
| LANG | Spracheinstellung / Zeichensatz | de_DE.UTF-8 |
Debugging-Tipp: Umgebung prüfen
/usr/bin/php statt php), auch wenn $PATH gesetzt ist. Damit sind Cronjobs unabhängig von der Umgebungskonfiguration.Ausgabe & Logging
Standardmäßig sendet Cron die Ausgabe eines Jobs per E-Mail an den ausführenden User. Auf Servern ohne Mailserver landet das im System-Maillog und kann sich aufstauen. Sauberes Output-Handling ist daher essenziell.
System-Cron-Log prüfen
MAILTO="" auch als Inline-Variable vor einem einzelnen Job gesetzt werden, um nur diesen Job stumm zu schalten.System-Crontabs
Neben den User-Crontabs gibt es systemweite Cron-Konfigurationen, die von Root verwaltet werden und spezielle Strukturen bieten.
/etc/crontab
Die systemweite Crontab mit einem zusätzlichen User-Feld nach den Zeitfeldern. Hier wird explizit angegeben, als welcher User der Job läuft.
/etc/cron.d/
Verzeichnis für zusätzliche Crontab-Dateien. Gleiche Syntax wie /etc/crontab mit User-Feld. Wird von Paketen genutzt (z.B. legt php dort eigene Einträge ab).
Drop-In-Verzeichnisse
| Verzeichnis | Ausführung | Zweck |
|---|---|---|
| /etc/cron.hourly/ | Stündlich | Scripts werden stündlich ausgeführt (via run-parts) |
| /etc/cron.daily/ | Täglich | Tägliche Maintenance-Scripts (logrotate, etc.) |
| /etc/cron.weekly/ | Wöchentlich | Wöchentliche Bereinigungen und Reports |
| /etc/cron.monthly/ | Monatlich | Monatliche Archivierung und Statistiken |
run-parts auf. Dabei werden nur ausführbare Dateien ohne Dateiendung oder mit spezifisch erlaubten Endungen ausgeführt. Dateien mit einem Punkt im Namen (z.B. backup.sh) werden von einigen run-parts-Versionen ignoriert — Dateinamen ohne .sh sind sicherer.Anacron
Anacron ist die Lösung für das zentrale Problem von Cron: Wenn ein Rechner zum geplanten Zeitpunkt ausgeschaltet ist, verfällt der Job einfach. Anacron merkt sich, wann ein Job zuletzt ausgeführt wurde, und holt ihn beim nächsten Start nach — ideal für Laptops, Desktop-PCs und Systeme ohne 24/7-Uptime.
Anacron vs. Cron
| Eigenschaft | Cron | Anacron |
|---|---|---|
| Sub-Tages-Intervalle | ✔ Ja | ✘ Nein |
| Nachholung verpasster Jobs | ✘ Nein | ✔ Ja |
| Läuft als User | ✔ Ja | Nur root |
| Minutengenaue Planung | ✔ Ja | ✘ Nein |
Anacron Status prüfen
Fehlerdiagnose
Cronjobs schweigen standardmäßig — kein Fenster, kein Feedback, kein Fehler-Popup. Debugging erfordert systematisches Vorgehen.
grep CRON /var/log/syslog | tail -30 zeigt, ob der Job überhaupt gestartet wurde. "CMD" = gestartet, kein Eintrag = Zeitausdruck falsch oder Cron läuft nicht.env -i HOME=/root SHELL=/bin/bash /pfad/script.sh simuliert die minimale Cron-Umgebung. Schlägt das fehl? → PATH oder fehlende Variablen.>> /tmp/debug.log 2>&1 anhängen und Log nach dem nächsten Run prüfen.chmod +x /pfad/script.sh. User muss Leserecht auf alle benötigten Dateien haben.Häufige Fehlerquellen
| Problem | Ursache | Lösung |
|---|---|---|
| Job läuft nie | Zeitausdruck falsch | Ausdruck auf crontab.guru prüfen |
command not found |
$PATH zu kurz | Absolute Pfade verwenden (/usr/bin/php) |
| Script schlägt fehl | Umgebungsvariablen fehlen | Variablen im Script oder Crontab-Kopf setzen |
Permission denied |
Script nicht ausführbar | chmod +x script.sh |
| Relative Pfade scheitern | Arbeitsverzeichnis = $HOME, nicht Script-Dir |
cd /pfad/zum/script && ./script.sh |
% im Befehl bricht ab |
% ist Sonderzeichen in Crontab |
\% escapen oder in Script auslagern |
| Cron startet nie | Cron-Daemon nicht aktiv | systemctl start cron |
Sicherheit
Cronjobs laufen unbeaufsichtigt — eine unsichere Konfiguration ist schwerer zu entdecken als bei interaktiven Prozessen. Besonders Root-Cronjobs und World-Writable-Scripts sind kritische Angriffsvektoren.
Jobs immer mit dem User ausführen, der die minimal nötigen Rechte hat. Root-Crontabs nur wenn zwingend erforderlich.
Scripts in Crontabs dürfen nicht world-writable sein. Angreifer könnten sonst fremden Code einschleusen, der als Root läuft.
Immer absolute Pfade verwenden — verhindert PATH-Hijacking-Angriffe, bei denen ein böswilliger bash-Binary im $PATH landet.
/etc/cron.allow und /etc/cron.deny steuern, welche User Crontabs anlegen dürfen.
chmod 700 oder 750 haben.cron.allow / cron.deny Logik
| Zustand | Verhalten |
|---|---|
/etc/cron.allow existiert |
Nur User in dieser Datei dürfen crontab nutzen |
/etc/cron.deny existiert (kein allow) |
Alle User außer den genannten dürfen crontab nutzen |
| Keine Datei existiert | Alle User dürfen crontab nutzen (Default auf Ubuntu) |
| Beide Dateien existieren | cron.allow hat Vorrang, cron.deny wird ignoriert |