Was ist ein Cron-Ausdruck? Syntax, Felder und 15 Beispiele

Ein Cron-Ausdruck ist eine kurze Zeichenkette, die einem Scheduler sagt, wann ein Job laufen soll. Die Standardform besteht aus fünf durch Leerzeichen getrennten Feldern: Minute, Stunde, Tag des Monats, Monat und Wochentag. So bedeutet */15 * * * * „alle 15 Minuten“: */15 im Minutenfeld trifft die Minuten 0, 15, 30 und 45, und die vier Sternchen stehen für jede Stunde, jeden Tag, jeden Monat und jeden Wochentag.

Kostenlos ausprobieren: Crontab-Generator Kostenlos und ohne Anmeldung nutzbar.

Der Name stammt von cron, dem Unix-Zeitplaner. Dieselbe Syntax steuert heute aber auch CI-Pipelines, Cloud-Scheduler und Anwendungs-Frameworks, teilweise mit zusätzlichen Feldern. Dieser Leitfaden erklärt die Syntax, 15 geprüfte Beispiele, die gängigen Varianten und die Fehler, durch die ein Job zur falschen Zeit läuft. Um einen Ausdruck beim Lesen zu prüfen, fügen Sie ihn in den kostenlosen Crontab-Generator ein, der den Zeitplan in verständlichen Worten beschreibt.

Die fünf Felder eines Cron-Ausdrucks

Die Felder werden von links nach rechts gelesen:

Position Feld Erlaubte Werte Namen
1 Minute 0–59
2 Stunde 0–23
3 Tag des Monats 1–31
4 Monat 1–12 jandec
5 Wochentag 0–7 (0 und 7 sind beide Sonntag) sunsat

Stunden werden im 24-Stunden-Format angegeben, 14 Uhr ist also 14. Namen sind die ersten drei Buchstaben des englischen Monats oder Wochentags, Groß- und Kleinschreibung spielt keine Rolle. Manche Implementierungen, darunter das cron von macOS, akzeptieren keine Namen in Bereichen oder Listen. 1-5 ist deshalb portabler als mon-fri.

In einer Crontab-Datei folgt der Befehl auf die fünf Felder: 0 2 * * * /home/me/backup.sh. Die systemweite /etc/crontab unter Linux hat vor dem Befehl zusätzlich ein Feld für den Benutzernamen.

Sonderzeichen: Sternchen, Komma, Bindestrich und Schrägstrich

Vier Zeichen erledigen fast die ganze Arbeit:

Zeichen Bedeutung Beispiel Trifft
* Jeder Wert * im Stundenfeld Stunden 0, 1, 2 … 23
, Liste 8,20 im Stundenfeld Stunden 8 und 20
- Bereich (einschließlich) 1-5 im Wochentagsfeld Montag bis Freitag
/ Schrittweite */15 im Minutenfeld Minuten 0, 15, 30, 45

Sie lassen sich kombinieren. 9-17/2 im Stundenfeld trifft 9, 11, 13, 15 und 17, und 0-4,8-12 ist eine Liste aus zwei Bereichen.

Schrittweiten beginnen in jedem Zyklus neu. */7 im Minutenfeld trifft 0, 7, 14 … 56 und zu Beginn der nächsten Stunde wieder 0. Zwischen :56 und :00 liegen also vier Minuten, nicht sieben. Ein Schritt, der 60 Minuten oder 24 Stunden nicht glatt teilt, ergibt nie ein ganz gleichmäßiges Intervall.

15 Beispiele für Cron-Ausdrücke

Jedes Beispiel wurde Feld für Feld geprüft. Die Zeiten gelten in der Zeitzone des Schedulers.

Cron-Ausdruck Wann er läuft
* * * * * Jede Minute
*/5 * * * * Alle 5 Minuten (:00, :05, :10 …)
30 * * * * Jede Stunde zur halben Stunde (00:30, 01:30 …)
0 */2 * * * Alle 2 Stunden zur vollen Stunde (00:00, 02:00 … 22:00)
0 2 * * * Täglich um 02:00
0 8,20 * * * Zweimal täglich, um 08:00 und 20:00
0 9 * * 1-5 Montag bis Freitag um 09:00
*/15 9-17 * * 1-5 Alle 15 Minuten von 09:00 bis 17:45, Montag bis Freitag
0 6 * * 0,6 Samstags und sonntags um 06:00
0 0 * * 0 Jeden Sonntag um Mitternacht
0 22 * * 5 Jeden Freitag um 22:00
0 0 1 * * Am 1. jedes Monats um Mitternacht
0 12 15 * * Am 15. jedes Monats um 12:00
0 0 1 1,4,7,10 * Vierteljährlich: am 1. Januar, April, Juli und Oktober um Mitternacht
0 0 1 1 * Einmal im Jahr, am 1. Januar um Mitternacht

Zwei Details werden leicht übersehen. Erstens schließen Bereiche beide Enden ein, 9-17 enthält also die Stunde 17: */15 9-17 * * 1-5 läuft 36-mal am Tag, und der letzte Lauf ist um 17:45, nicht um 17:00. Zweitens ergibt 0 0 1 */3 * denselben vierteljährlichen Zeitplan, weil */3 im Monatsfeld bei 1 beginnt und die Monate 1, 4, 7 und 10 trifft.

Nicht standardisierte Makros: @daily, @weekly und @reboot

Viele Cron-Implementierungen akzeptieren statt der fünf Felder ein Schlüsselwort:

Makro Entspricht Läuft
@yearly oder @annually 0 0 1 1 * Um Mitternacht am 1. Januar
@monthly 0 0 1 * * Um Mitternacht am 1. jedes Monats
@weekly 0 0 * * 0 Sonntags um Mitternacht
@daily oder @midnight 0 0 * * * Täglich um Mitternacht
@hourly 0 * * * * In Minute 0 jeder Stunde
@reboot Einmal, wenn der Cron-Daemon startet

Vixie cron, cronie und das cron von macOS unterstützen alle, Kubernetes-CronJobs akzeptieren die zeitbasierten, aber nicht @reboot. Sie gehören nicht zum POSIX-Standard, prüfen Sie also die Dokumentation, bevor Sie sie anderswo einsetzen.

Cron-Varianten: Sekunden, Jahre und zusätzliche Zeichen

Nicht jeder Scheduler liest fünf Felder. Prüfen Sie daher, für welchen Dialekt Sie schreiben.

Die Falle mit Tag des Monats und Wochentag

Im Standard-cron (Vixie) werden die beiden Tagesfelder mit ODER statt UND verknüpft, wenn beide eingeschränkt sind. Steht in einem der beiden *, zählt nur das andere. 0 9 1-7 * 1 bedeutet deshalb nicht „am ersten Montag im Monat“. Der Job läuft um 09:00 an jedem der Tage 1 bis 7 und zusätzlich an jedem Montag, also 10- oder 11-mal im Monat.

Soll er nur am ersten Montag laufen, behalten Sie ein Tagesfeld im Ausdruck und prüfen das andere im Befehl:

0 9 1-7 * * [ "$(date +\%u)" = 1 ] && /path/to/report.sh

date +%u gibt den Wochentag als Zahl von 1 bis 7 aus, mit Montag = 1. Das Prozentzeichen muss als \% maskiert werden, weil cron ein unmaskiertes % im Befehl in einen Zeilenumbruch verwandelt. Quartz und AWS umgehen die Mehrdeutigkeit, indem sie in einem der beiden Tagesfelder ? verlangen.

Zeitzonen und Sommerzeit

Cron läuft in der Zeitzone des Rechners oder Dienstes, der den Ausdruck auswertet. Auf Servern und Cloud-Plattformen ist das oft UTC, nicht Ihre Ortszeit. 0 9 * * * auf einem UTC-Server läuft um 09:00 UTC, in Berlin während der Sommerzeit (UTC+2) also um 11:00. Mit dem Zeitzonen-Umrechner übertragen Sie eine Ortszeit in die Zeitzone des Schedulers.

Die Sommerzeit bringt in Zeitzonen, die sie nutzen, zwei Sonderfälle: Wird die Uhr vorgestellt, gibt es eine Stunde nicht, wird sie zurückgestellt, gibt es eine Stunde zweimal. Das cron von Debian und cronie gleichen kleine Zeitsprünge für Jobs mit fester Uhrzeit aus: Ein Lauf in der übersprungenen Stunde wird kurz nach der Umstellung nachgeholt, ein Lauf in der doppelten Stunde wird nicht wiederholt. Andere Scheduler verhalten sich anders. Am sichersten ist es, Server in UTC zu betreiben oder wichtige Jobs aus den Umstellungsstunden herauszuhalten, typischerweise zwischen 01:00 und 03:00 Ortszeit.

So testen Sie einen Cron-Ausdruck

Ein falscher Cron-Ausdruck erzeugt selten eine Fehlermeldung, der Job läuft einfach zur falschen Zeit oder nie. Eine kurze Routine findet die meisten Probleme:

  1. In Worten gegenlesen. Fügen Sie den Ausdruck in ein Beschreibungswerkzeug ein und prüfen Sie, ob der Satz dem entspricht, was Sie meinen, vor allem bei den beiden Tagesfeldern.
  2. Den Befehl mit einem kurzen Zeitplan testen. Verwenden Sie vorübergehend * * * * *, damit der Job innerhalb einer Minute läuft, und stellen Sie danach den echten Zeitplan ein.
  3. Die Ausgabe festhalten. Hängen Sie >> /tmp/myjob.log 2>&1 an den Befehl an, damit Fehler in einer Datei landen, statt verloren zu gehen.
  4. Das Cron-Log prüfen. Nutzen Sie grep CRON /var/log/syslog oder journalctl -u cron unter Debian und Ubuntu und journalctl -u crond unter Fedora und RHEL.
  5. Absolute Pfade verwenden. Cron startet Jobs mit einer minimalen Umgebung und einem kurzen PATH. Ein Befehl, der im Terminal funktioniert, kann unter cron daher scheitern.

Einen Ausdruck mit dem Crontab-Generator erstellen

Der kostenlose Crontab-Generator läuft vollständig in Ihrem Browser. Geben Sie einen Ausdruck ein oder klicken Sie auf eine Schnellvorlage wie „Alle 15 Min.“, „Täglich um 2 Uhr“ oder „Jeden Montag“. Das Tool:

Schalter steuern eine ausführlichere Beschreibung, das 24-Stunden-Format und ob die Wochentagszahlen bei 0 für Sonntag beginnen. Reine Quartz-Zeichen (L, W, #) und ein Jahresfeld werden nicht akzeptiert. Das Tool erstellt und prüft den Ausdruck nur. Um den Job einzuplanen, kopieren Sie ihn in crontab -e oder in die Konfiguration Ihrer Plattform.

Häufige Fragen

Was ist der Unterschied zwischen cron und crontab?

Cron ist der Hintergrunddienst (Daemon), der geplante Jobs ausführt. Eine Crontab, kurz für „cron table“, ist die Datei, in der sie stehen, ein Job pro Zeile: ein Cron-Ausdruck, gefolgt von einem Befehl. Ihre eigene Crontab bearbeiten Sie mit crontab -e und zeigen sie mit crontab -l an.

Kann ein Cron-Job alle 30 Sekunden laufen?

Im Standard-cron nicht, denn die kleinste Einheit ist eine Minute. Scheduler mit Sekundenfeld können es: Spring akzeptiert */30 * * * * *, Quartz braucht ein ? in einem Tagesfeld, etwa */30 * * * * ?. Mit klassischem cron hilft man sich oft mit zwei Zeilen, die beide jede Minute laufen, wobei eine vor dem Befehl sleep 30; ausführt.

Wie lasse ich einen Cron-Job am letzten Tag des Monats laufen?

Standard-cron kennt kein Zeichen für „letzter Tag“, Quartz und AWS unterstützen aber L im Feld für den Tag des Monats. Im klassischen cron planen Sie die Tage 28 bis 31 ein und lassen den Befehl prüfen, ob morgen der 1. ist:

0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job.sh

date -d tomorrow ist Syntax von GNU date, wie unter Linux üblich. Unter macOS verwenden Sie stattdessen date -v+1d.

Kostenlos ausprobieren: Crontab-Generator Kostenlos und ohne Anmeldung nutzbar.