Cron testen: was ein Crontab-Ausdruck wirklich ausführt
Ein Cron-Test zeigt, was ein Crontab-Ausdruck bedeutet und wann er das nächste Mal läuft. Tag im Monat und Wochentag werden mit ODER verknüpft — deshalb feuert ein Zeitplan öfter, als du ihn geschrieben hast.
Ein Cron-Test beantwortet „wann läuft diese Zeile?“. Das ist eine andere Frage als „ist der Job wirklich gelaufen?“. Gesucht wird „cron test“ und „crontab test“, weil die fünf Felder sich leicht falsch lesen lassen und der Fehler erst um drei Uhr nachts auffällt — oder gar nicht. Der Ausdrucks-Tester auf dieser Website wertet die Zeile in deinem Browser aus, beschreibt sie in einem Satz und listet die nächsten fünf Läufe. An einen Server geht nichts.
Die fünf Felder, in der Reihenfolge, in der cron sie liest
| Feld | Bereich | Die Falle |
|---|---|---|
| Minute | 0–59 | Standard-cron hat kein Sekundenfeld. Alle 30 Sekunden ist kein Ausdruck, den man portabel hinschreiben kann. |
| Stunde | 0–23 | Die Uhr ist die lokale Zeit der Maschine, auf einem Server oft UTC. Dieser Tester zeigt die Läufe in der Zeitzone deines Browsers und sagt das dazu. |
| Tag im Monat | 1–31 | Mit dem Wochentag per ODER verknüpft, sobald beide eingeschränkt sind. Siehe unten. |
| Monat | 1–12 oder JAN–DEC | Namen sind unabhängig von Großschreibung. Ein Tag, den es nicht gibt, etwa der 30. Februar, läuft nie. |
| Wochentag | 0–7 oder SUN–SAT | 0 und 7 bedeuten beide Sonntag. |
Die Syntax darüber ist klein. * ist jeder Wert. 1,15,30 ist eine Liste. 9-17 ist ein Bereich inklusive der Enden. */15 ist jeder 15. Wert ab dem Anfang des Feldes. 0-30/10 ist jeder 10. Wert innerhalb dieses Bereichs.
Crontab-Test: das ODER, das überrascht
Wenn Tag im Monat und Wochentag beide nicht * sind, läuft der Job, sobald eines der beiden Felder passt. 0 0 13 * 5 heißt also Mitternacht am 13. und zusätzlich Mitternacht an jedem Freitag. Es heißt nicht Freitag, der 13. Cron kann „Freitag, der 13.“ nicht ausdrücken. Wenn du das brauchst, muss der Job das Datum selbst prüfen und sonst aufhören.
Ein Cron-Test sagt nicht, dass der Job gelaufen ist
„Cronjob monitoring“ ist das andere Problem. Cron erzeugt keinen Fehler, wenn eine Zeile nie aufgerufen wird: Der Crontab ist bei einer Migration verloren gegangen, der Daemon läuft nicht, das Skript funktioniert in deiner Shell und scheitert in crons leerer Umgebung. Ein korrekter Ausdruck ist nötig und nicht hinreichend. Von einem ausgefallenen Lauf erfährst du über einen Heartbeat: Der Job ruft nach erfolgreicher Arbeit eine URL auf, und du wirst alarmiert, wenn dieser Aufruf nicht innerhalb der Karenzzeit ankommt.
Heartbeat-Monitore gibt es in den bezahlten Tarifen, ab Solo. Der Gratis-Tarif umfasst nur HTTP, Port und Ping. Der Aufruf selbst ist ein GET oder POST auf https://api.hypermonitors.com/v1/heartbeat/YOUR_TOKEN, und er steht nach der Arbeit, damit ein gescheiterter Job nicht pingt. Karenzzeit, Exit-Codes und Container stehen ausführlich im Artikel über Cronjob-Überwachung.