Crontab-Syntax
┌───────────── Minute 0–59
│ ┌─────────── Stunde 0–23
│ │ ┌───────── Tag im Monat 1–31
│ │ │ ┌─────── Monat 1–12 oder jan–dec
│ │ │ │ ┌───── Wochentag 0–7 oder sun–sat (0 und 7 sind Sonntag)
│ │ │ │ │
* * * * * auszuführender Befehl | Syntax | Bedeutung | Beispiel | |
|---|---|---|---|
| * | Jeder Wert | * * * * * | jede Minute |
| 5 | Genau dieser Wert | 5 0 * * * | täglich 00:05 |
| 1-5 | Ein Bereich | 0 9 * * 1-5 | 09:00 an Werktagen |
| */15 | Jeder n-te Wert | */15 * * * * | alle 15 Minuten |
| 1,15 | Eine Liste | 0 0 1,15 * * | Mitternacht am 1. und 15. |
| 8-18/2 | Schritt innerhalb eines Bereichs | 0 8-18/2 * * * | alle 2 Stunden von 08:00 bis 18:00 |
| @daily | Makro | @daily | wie 0 0 * * * |
Die Falle Tag-im-Monat / Wochentag
Sind sowohl Tag im Monat als auch Wochentag eingeschränkt, läuft Standard-Cron, wenn eines passt, nicht beide. 0 0 13 * 5 löst an jedem 13. und an jedem Freitag aus, nicht nur an Freitag, dem 13. Der Erklärer weist auf diesen Fall hin.
Zeitzonen und Sommerzeit
Cron läuft in der Systemzeitzone des Rechners (oder, wo unterstützt, nach der Variable CRON_TZ / TZ). In der Nacht der Zeitumstellung nach vorn läuft ein Job für 02:30 womöglich gar nicht; beim Zurückstellen vielleicht zweimal. Jobs, die genau einmal täglich laufen müssen, sind zwischen 03:00 und 23:00 oder in UTC am sichersten. Die Laufliste oben nutzt echte Kalenderregeln der gewählten Zone, sodass Sie eine Umstellungsnacht direkt prüfen können.
Weitere Dinge, die man wissen sollte
- Cron hat Minutenauflösung. Für Sekunden nutzen Sie einen systemd-Timer oder eine Schleife im Job.
- Die Umgebung ist minimal: Setzen Sie
PATHin der crontab oder nutzen Sie absolute Pfade, und leiten Sie die Ausgabe um, sonst wird sie Ihnen gemailt. %im Befehlsfeld ist ein Zeilenumbruch, sofern nicht als\%maskiert, wasdate +%Ftrifft.- Sechs-Feld-Ausdrücke mit Sekundenspalte sind Quartz/Spring-Syntax, und die nicht standardisierten
L,Wund#sind ebenfalls Quartz. Normales crontab akzeptiert sie nicht.
Fragen
Wie lasse ich einen Cron-Job alle 5 Minuten laufen?
*/5 * * * *. Für alle 5 Minuten nur während der Arbeitszeit: */5 9-17 * * 1-5.
Wie lasse ich etwas täglich um Mitternacht laufen?
0 0 * * * oder das Makro @daily. Für 00:30 nutzen Sie 30 0 * * *.
Wie plane ich den letzten Tag des Monats?
Standard-Cron kann das nicht direkt ausdrücken. Lassen Sie den Job an den Tagen 28–31 laufen und das Skript prüfen, ob morgen der 1. ist: 0 0 28-31 * * [ "$(date -d tomorrow +%d)" = "01" ] && /pfad/zum/job.
Ist der Wochentag für Sonntag 0 oder 7?
Beides. 0 und 7 sind in den meisten Cron-Implementierungen Sonntag; Montag ist 1. Namen (sun, mon) werden ebenfalls akzeptiert und sind schwerer falsch zu machen.
Warum lief mein Job zur falschen Zeit?
Fast immer die Zeitzone: Der Server läuft in UTC und Sie erwarteten Ortszeit, oder umgekehrt. Prüfen Sie mit date auf dem Server, oder setzen Sie CRON_TZ=Europe/Berlin oben in der crontab, wo unterstützt (cronie, Vixie cron).
Was ist der Unterschied zwischen Cron und systemd-Timern?
Timer können mit Kalenderausdrücken mit Sekunden laufen, verpasste Läufe nach einem Neustart nachholen (Persistent=true), ins Journal loggen und von anderen Units abhängen. Cron ist einfacher und universell. Beide eignen sich für gewöhnliche geplante Jobs.