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 | jan–dec |
| 5 | Wochentag | 0–7 (0 und 7 sind beide Sonntag) | sun–sat |
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.
- Quartz (Java) verwendet sechs oder sieben Felder: Sekunden, Minuten, Stunden, Tag des Monats, Monat, Wochentag und optional das Jahr. Eines der beiden Tagesfelder muss
?(„kein bestimmter Wert“) sein. Quartz unterstützt außerdemL(letzter),W(nächster Werktag) und#(n-ter Wochentag im Monat):0 15 10 L * ?läuft um 10:15 am letzten Tag jedes Monats, und0 15 10 ? * 6#3läuft um 10:15 am dritten Freitag, weil Quartz die Wochentage von 1 bis 7 zählt, beginnend mit Sonntag. - Spring-Ausdrücke in
@Scheduled(cron = "…")haben sechs Felder: zuerst die Sekunden, dann die üblichen fünf, ohne Jahr. - AWS EventBridge-Regeln verwenden
cron(minutes hours day-of-month month day-of-week year): sechs Felder, keine Sekunden, am Ende das Jahr und ein?in einem der beiden Tagesfelder.cron(0 12 * * ? *)läuft täglich um 12:00 UTC. Regeln auf einem Event-Bus laufen in UTC, beim EventBridge Scheduler können Sie eine Zeitzone wählen. Wie Quartz zählt AWS die Wochentage von 1 bis 7 mit 1 = Sonntag. - Kubernetes-CronJobs nutzen die üblichen fünf Felder in
spec.schedule. Ohnespec.timeZonerichtet sich der Zeitplan nach der Zeitzone des kube-controller-manager. Setzen Sie das Feld auf einen IANA-Namen wieEurope/Berlin, um ihn festzulegen. - GitHub Actions-Trigger mit
scheduleverwenden fünf Felder und laufen in UTC, sofern Sie keine optionale IANA-Zeitzone angeben. Das kürzeste unterstützte Intervall sind fünf Minuten, Makros wie@dailywerden nicht unterstützt, und geplante Läufe können sich verzögern, wenn GitHub stark ausgelastet ist – vor allem zur vollen Stunde.
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:
- 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.
- 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. - Die Ausgabe festhalten. Hängen Sie
>> /tmp/myjob.log 2>&1an den Befehl an, damit Fehler in einer Datei landen, statt verloren zu gehen. - Das Cron-Log prüfen. Nutzen Sie
grep CRON /var/log/syslogoderjournalctl -u cronunter Debian und Ubuntu undjournalctl -u crondunter Fedora und RHEL. - 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:
- prüft die Syntax und meldet ungültige Ausdrücke;
- beschreibt den Zeitplan in verständlichem Deutsch;
- akzeptiert die fünf Standardfelder, ein optionales Sekundenfeld am Anfang, Monats- und Wochentagsnamen sowie 7 für Sonntag;
- übersetzt Makros wie
@weeklyin ihre Form mit fünf Feldern und erklärt, was@rebootbewirkt; - zeigt eine Übersicht aller Symbole mit je einem Beispiel.
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.