Developer Tools

Cron-Jobs und Cron-Syntax verständlich erklärt

Ein Cron-Job ist ein zeitgesteuerter Hintergrundprozess (Daemon) in unixoiden Betriebssystemen wie Linux oder macOS, der Aufgaben zu vordefinierten Zeiten oder in festen Intervallen vollautomatisch ausführt.

Der zugrundeliegende Systemdienst heisst Cron-Daemon (oder kurz cron). Er läuft kontinuierlich im Hintergrund und prüft minütlich, ob in den Konfigurationsdateien (den sogenannten Crontabs) Aufgaben hinterlegt sind, die zum aktuellen Zeitpunkt ausgeführt werden müssen. Typische Anwendungsfälle sind regelmässige Datenbank-Backups, das Löschen temporärer Protokolle oder der wöchentliche Newsletter-Versand.

Cron ist damit eines der grundlegendsten Automatisierungs-Werkzeuge in der Werkzeugkiste eines Entwicklers – vergleichbar nützlich wie ein Epoch-Timestamp-Rechner für Zeitstempel oder ein CIDR/Subnet-Rechner für Netzbereiche. Eine Übersicht aller Helfer bietet die Seite Developer Tools.


Die Cron-Syntax verstehen (Die 5 Felder)

Jeder Eintrag in einer Crontab besteht aus einer einzigen Zeile, die in zwei Hauptteile gegliedert ist: die Zeitdefinition und den auszuführenden Befehl.

Die Zeitdefinition besteht aus exakt fünf Feldern, die durch Leerzeichen getrennt sind:

┌────────────── Minute (0 - 59)
│ ┌──────────── Stunde (0 - 23)
│ │ ┌────────── Tag des Monats (1 - 31)
│ │ │ ┌──────── Monat (1 - 12 oder JAN-DEC)
│ │ │ │ ┌────── Wochentag (0 - 6, wobei 0/7 = Sonntag, oder SUN-SAT)
│ │ │ │ │
* * * * *  /pfad/zu/ihrem/skript.sh

Die Wertebereiche im Detail:

  1. Minute: Bestimmt die Minute der Ausführung (z. B. 15 für die 15. Minute der Stunde).
  2. Stunde: Bestimmt die Stunde der Ausführung (z. B. 0 für Mitternacht, 14 für 14:00 Uhr).
  3. Tag des Monats: Der Kalendertag (z. B. 1 für den Monatsanfang).
  4. Monat: Der Monat der Ausführung (z. B. 6 für Juni oder JUN).
  5. Wochentag: Der Wochentag der Ausführung. Dabei steht sowohl 0 als auch 7 für Sonntag, 1 für Montag usw.

Sonderzeichen zur flexiblen Zeitsteuerung

Die wahre Stärke der Cron-Syntax liegt in der Verwendung spezieller Steuerzeichen, mit denen sich komplexe Intervalle definieren lassen.

  • Der Stern (* - Wildcard): Steht für „jeden Wert“. Ein * im Feld Minute bedeutet, dass der Befehl in jeder Minute ausgeführt wird.
  • Das Komma (, - Aufzählung): Ermöglicht die Angabe mehrerer fixer Zeitpunkte. 0,30 im Stundenfeld bedeutet beispielsweise die Ausführung um 0:00 Uhr und um 30:00 Uhr (bzw. Minute 0,30).
  • Der Bindestrich (- - Bereich): Definiert einen geschlossenen Zeitraum. 1-5 im Wochentagsfeld bedeutet die Ausführung von Montag bis Freitag.
  • Der Schrägstrich (/ - Schrittweite): Definiert Intervalle. */5 im Minutenfeld bedeutet „alle 5 Minuten“.
  • Das Fragezeichen (?): Wird in einigen Cron-Systemen (wie Spring Framework oder Quartz) anstelle von * verwendet, um anzugeben, dass der Wert für Tag des Monats oder Wochentag nicht spezifiziert ist (Vermeidung von Konflikten).

Syntax-Beispiele aus der Praxis:

  • */15 * * * * — Führt den Befehl alle 15 Minuten aus.
  • 0 4 * * 1 — Führt den Befehl jeden Montag um 04:00 Uhr morgens aus (typisch für wöchentliche Backups).
  • 30 22 1 * * — Führt den Befehl am 1. Tag jedes Monats um 22:30 Uhr aus.
  • 0 8-17 * * 1-5 — Führt den Befehl zu jeder vollen Stunde zwischen 8:00 und 17:00 Uhr aus, jedoch nur an Arbeitstagen (Montag bis Freitag).

Häufige Ausdrücke im Überblick

Cron-AusdruckBedeutungTypischer Einsatz
* * * * *jede MinuteHealth-Checks, Monitoring
*/5 * * * *alle 5 MinutenQueue-Verarbeitung
0 * * * *zu jeder vollen StundeCache-Erneuerung
0 3 * * *täglich um 03:00 Uhrnächtliches Backup
0 0 1 * *am 1. jedes MonatsMonats-Reports
0 9 * * 1montags um 09:00 UhrWochen-Newsletter

Best Practices für stabile Cron-Jobs

  • Verwenden Sie absolute Pfade: Cron-Jobs laufen in einer sehr minimalen Umgebung (Environment) und kennen die PATH-Variable Ihres Benutzers oft nicht. Verwenden Sie im Befehls-Teil immer absolute Pfade (z. B. /usr/bin/python3 statt nur python3).
  • Fehler-Ausgaben umleiten (Logging): Standardmässig sendet Cron Fehlermeldungen per lokaler Mail an den Systemadministrator. Um Ausgaben stattdessen in eine Logdatei zu schreiben, leiten Sie den Output um: 0 2 * * * /skript.sh > /var/log/skript.log 2>&1 (Der Teil 2>&1 leitet auch eventuelle Fehlermeldungen (stderr) in dieselbe Logdatei (stdout) um).
  • Überlappungen verhindern: Dauert ein Skript länger als das geplante Intervall (z. B. ein Backup-Skript läuft 15 Minuten, startet aber alle 10 Minuten), laufen mehrere Prozesse parallel. Verwenden Sie Tools wie flock, um Mehrfachstarts zu blockieren.

Typische Fehler und ihre Folgen

FehlerSymptomLösung
Relativer Pfad (python3)Job startet manuell, aber nicht via Cronabsoluten Pfad /usr/bin/python3 verwenden
Kein LoggingJob scheitert lautlosOutput mit > log 2>&1 umleiten
%-Zeichen unmaskiertBefehl bricht ab% mit \% escapen
Falsches ZeitfeldJob läuft 60-mal statt einmalMinutenfeld nicht auf * lassen
Keine Überlappungssperremehrere Instanzen gleichzeitigflock vor das Skript setzen

Praxisbeispiel: Sicheres nächtliches Backup

Ein häufiger Anfängerfehler ist ein Backup-Job, der relativ konfiguriert ist und keine Logs schreibt – scheitert er, merkt es niemand:

  • Vorher (fehleranfällig): 30 2 * * * backup.sh – Cron findet backup.sh nicht (kein Pfad), Fehler verschwinden in der lokalen Mail.
  • Nachher (robust):
30 2 * * * /usr/bin/flock -n /tmp/backup.lock /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

Dieser Ausdruck läuft täglich um 02:30 Uhr, verwendet absolute Pfade, schreibt alle Ausgaben samt Fehlern in eine Logdatei und verhindert mit flock, dass sich zwei Backup-Läufe überschneiden. So bleibt die Automatisierung nachvollziehbar und stabil.

[!TIP] Die Erstellung fehlerfreier Cron-Ausdrücke ist oft knifflig und kann bei Fehlkonfigurationen zu Server-Überlastungen führen. Nutzen Sie den Cron Generator auf balou.tools, um Ihre Zeitpläne visuell zu erstellen und sich die nächsten Ausführungszeiten anzeigen zu lassen. Eine Übersicht über weitere praktische Werkzeuge finden Sie in den Developer Tools.

Häufig gestellte Fragen (FAQ)

Was ist der Unterschied zwischen Cron und Systemd-Timern?

Cron ist das klassische, leichtgewichtige Werkzeug zur Zeitsteuerung. Systemd-Timer sind die modernere Alternative unter Linux. Sie bieten präziseres Logging, Abhängigkeitsprüfungen und Ressourcenlimits, sind jedoch in der Konfiguration komplexer.

Wo werden Cron-Jobs unter Linux konfiguriert?

Cron-Jobs werden über die sogenannte Crontab (Cron-Tabelle) verwaltet. Mit dem Befehl `crontab -e` öffnet man den Editor für die benutzerspezifische Crontab. Systemweite Jobs liegen zudem in Verzeichnissen wie `/etc/cron.d/` oder `/etc/crontab`.

In welcher Zeitzone laufen Cron-Jobs?

Standardmässig nutzt der Cron-Daemon die System-Zeitzone des Servers (oft UTC). Das führt zu Überraschungen, wenn der Server in UTC läuft, der Job aber zur lokalen Geschäftszeit ausgeführt werden soll. Manche Cron-Implementierungen erlauben die Variable `CRON_TZ=Europe/Zurich` am Anfang der Crontab, um die Zeitzone pro Datei festzulegen.

Was ist der Sonderwert `@reboot`?

Statt der fünf Zeitfelder akzeptieren viele Cron-Implementierungen Abkürzungen wie `@reboot`, `@daily`, `@hourly` oder `@weekly`. `@reboot` führt den Befehl einmalig beim Systemstart aus – nützlich, um Dienste oder Aufräumskripte nach einem Neustart zu starten.