In einem Satz
Ein Cron-Expression ist eine kompakte Zeichenkette, die einen wiederkehrenden Zeitplan definiert und einem Computer im Grunde sagt, wann er eine automatisierte Aufgabe ausführen soll.
Welches Problem es löst
Damals in der digitalen Steinzeit (den 1970ern), musstest du kreativ werden, wenn ein Computer etwas automatisch erledigen sollte – sagen wir, um Mitternacht temporäre Dateien löschen. Du hättest vielleicht ein klobiges Skript geschrieben, das in einer Endlosschleife lief, die Uhrzeit prüfte und dann eine Weile schlief. Das war unsauber, ineffizient und fehleranfällig.
Dann kam cron, ein Daemon (ein Hintergrundprozess), der in den Bell Labs des frühen Unix geboren wurde. Der Name ist eine Anspielung auf Chronos, die griechische Personifikation der Zeit, was so ziemlich das Geekigste ist, was man sich vorstellen kann. Crons Aufgabe war einfach, aber revolutionär: eine Liste von Befehlen und die Zeiten, zu denen sie ausgeführt werden sollen, einlesen und sie dann ausführen. Es war ein „Einmal einrichten und dann vergessen“-System für die Aufgabenautomatisierung.
Um cron zu sagen, wann es Dinge ausführen soll, brauchte es eine Sprache. Keine wortreiche, englischähnliche Sprache, sondern etwas, das ein Computer sofort parsen konnte. Diese Sprache ist die Cron-Expression. Sie löst das grundlegende Problem, wie man jeden denkbaren wiederkehrenden Zeitplan – „jeden Montag um 9 Uhr“, „am 1. und 15. jedes Monats“, „alle 10 Minuten“ – auf standardisierte, vorhersagbare Weise beschreibt. Ohne sie würde jeder Entwickler das Rad der Zeitplanung neu erfinden, und dein Server wäre ein chaotisches Durcheinander von selbstgebastelten sleep()-Befehlen.
Wie es unter der Haube funktioniert
Für Uneingeweihte sieht eine Cron-Expression wie eine Kette von Kauderwelsch aus, etwa so: */15 9-17 * * 1-5. Aber das ist keine Magie; es ist eine hochstrukturierte Mini-Sprache. Sobald du die Syntax gelernt hast, kannst du Zeitpläne wie ein Profi lesen und schreiben.
Die fünf Felder der Apokalypse (und Freunde)
Eine Standard-Cron-Expression besteht aus fünf Feldern, die durch Leerzeichen getrennt sind. Jedes Feld repräsentiert eine Zeiteinheit. Stell es dir wie fünf Zifferblätter vor, die du drehst, um den richtigen Moment einzustellen.
| Feld | Erlaubte Werte | Erlaubte Sonderzeichen |
|---|---|---|
| Minute | 0-59 | * , - / |
| Stunde | 0-23 | * , - / |
| Tag des Monats | 1-31 | * , - / ? L W |
| Monat | 1-12 oder JAN-DEC | * , - / |
| Wochentag | 0-7 oder SUN-SAT | * , - / ? L # |
Einige moderne Cron-Implementierungen fügen ein sechstes Feld für das Jahr (1970-2099) oder sogar ein führendes Feld für Sekunden (0-59) hinzu, aber das klassische Fünf-Felder-Format ist das gebräuchlichste.
Ein Hinweis zum Wochentag: Sowohl 0 als auch 7 werden oft für Sonntag akzeptiert. Es ist eine gute Idee, sich an eine Konvention zu halten (wie 0=So, 6=Sa).
Sonderzeichen: Die Geheimsprache
Die wahre Stärke von Cron-Expressions liegt in einer Handvoll Sonderzeichen, die die Zahlen modifizieren.
*(Das „Jedes“): Dies ist der Wildcard. Ein Sternchen imStunde-Feld bedeutet „jede Stunde des Tages“. Ein Sternchen in jedem Feld (* * * * *) bedeutet „jede Minute jeder Stunde jedes Tages jedes Monats ...“ Du verstehst schon.,(Das „und“): Das Komma fungiert als Trennzeichen für Listen.1,15imTag des Monats-Feld bedeutet „am 1. und am 15. des Monats“.-(Das „bis“): Der Bindestrich definiert einen Bereich.9-17imStunde-Feld bedeutet „jede Stunde von 9 Uhr bis 17 Uhr“./(Der „Schritt“): Der Schrägstrich wird verwendet, um Inkremente anzugeben.*/10imMinute-Feld bedeutet „alle 10 Minuten“. Du kannst es auch mit einem Bereich kombinieren:0-30/5bedeutet „alle 5 Minuten innerhalb der ersten 30 Minuten der Stunde“ (also um :00, :05, :10, :15, :20, :25, :30).?(Das „Ist mir egal“): Dieses Zeichen ist knifflig, aber wichtig. Du kannst nicht immer sowohl einenTag des Monatsals auch einenWochentagangeben, weil sie sich widersprechen können. Was passiert, wenn du sagst „ausführen am 13. des Monats und an einem Freitag“, aber der 13. auf einen Mittwoch fällt? Das?löst dieses Problem, indem es sagt: „Ich habe eines dieser Felder spezifiziert, also ignoriere das andere.“ Du würdest den Zeitplan auf* * 13 * ?setzen (ausführen am 13., egal welcher Wochentag es ist) oder* * ? * 5(ausführen an jedem Freitag, egal welcher Tag des Monats es ist).L(Das „Letzte“):LimTag des Monats-Feld bedeutet „der letzte Tag des Monats“ (also 31. Jan., 28./29. Feb. usw.). ImWochentag-Feld bedeutet es „der letzte X des Monats“. Zum Beispiel bedeutet5L„der letzte Freitag des Monats“.W(Der „Werktag“):15WimTag des Monats-Feld bedeutet „der nächstgelegene Werktag zum 15. des Monats“. Wenn der 15. ein Samstag ist, wird der Job am Freitag, den 14. ausgeführt. Wenn der 15. ein Sonntag ist, wird er am Montag, den 16. ausgeführt.#(Das „n-te“): Dies ist dafür da, um Dinge wie „den dritten Freitag des Monats“ zu finden. Der Ausdruck dafür wäre* * ? * 5#3.
Alles zusammenfügen
Lass uns ein paar gängige Ausdrücke entschlüsseln:
# Jede Nacht um Mitternacht ausführen
0 0 * * *
- 0 im Minutenfeld: bei Minute Null (zur vollen Stunde).
- 0 im Stundenfeld: bei Stunde Null (Mitternacht).
* * *in den anderen Feldern: an jedem Tag jeder Woche jedes Monats.
# Jeden Wochentag (Mo-Fr) um 8:30 Uhr morgens ausführen
30 8 * * 1-5
- 30 im Minutenfeld: 30 Minuten nach der vollen Stunde.
- 8 im Stundenfeld: um 8 Uhr morgens.
* *für Tag des Monats und Monat: egal.- 1-5 für den Wochentag: von Montag bis Freitag.
# Alle 15 Minuten während der Geschäftszeiten (9 bis 17 Uhr) an Wochentagen ausführen
*/15 9-17 * * 1-5
*/15: alle 15 Minuten.9-17: für die Stunden 9, 10, 11, 12, 13, 14, 15, 16 und 17.1-5: von Montag bis Freitag.
Geschichten aus der Praxis
Der Fall des mitternächtlichen Backups
Die Datenbank eines Startups wuchs rasant. Der leitende Sysadmin wusste, dass sie tägliche Backups brauchten, aber das Ausführen des Backup-Skripts während des Tages verlangsamte die gesamte Anwendung erheblich. Benutzer beschwerten sich, und potenzielle Verkäufe gingen verloren. Die Lösung? Ein einfacher Cronjob. Sie plante das ressourcenintensive Backup-Skript für 2 Uhr nachts, als der Website-Traffic praktisch bei Null lag. Der Ausdruck 0 2 * * * wurde zum stillen Helden des Unternehmens und sorgte dafür, dass ihre Daten sicher waren, ohne einen einzigen Benutzer zu stören.
Lektion: Plane ressourcenintensive Aufgaben für die Nebenzeiten, um die Performance aufrechtzuerhalten.
Der vergessene Newsletter
Eine kleine E-Commerce-Website wollte jeden Dienstagmorgen eine „Angebote der Woche“-E-Mail versenden, um den Umsatz anzukurbeln. Monatelang war ein Marketing-Mitarbeiter namens Dave damit beauftragt, um 10 Uhr manuell auf „Senden“ zu klicken. Aber eine Woche wurde Dave krank. Der Newsletter wurde nie verschickt, und die Verkäufe an diesem Dienstag waren düster. Der leitende Entwickler griff ein und automatisierte den Prozess. Er schrieb ein Skript zum Versenden des Newsletters und verband es mit einem Cronjob: 0 10 * * 2. Von da an ging der Newsletter wie am Schnürchen raus, egal, wer im Büro war.
Lektion: Automatisiere repetitive, zeitkritische Aufgaben, um die Zuverlässigkeit zu verbessern und menschliche Fehler zu eliminieren.
Der veraltete Cache
Eine Nachrichten-Website war stolz auf ihre Eilmeldungen, aber ihre Homepage fühlte sich oft langsam an. Ihr Inhalt wurde aus Performance-Gründen gecacht, aber der Cache wurde nur geleert, wenn ein Entwickler es manuell tat. Das bedeutete, dass neue Artikel manchmal erst Stunden später erschienen. Ein Entwickler richtete einen Cronjob ein, um den Cache der Seite alle fünf Minuten automatisch zu leeren und neu zu erstellen. Mit dem Ausdruck */5 * * * * wurde die Seite dramatisch schneller und aktueller, da neue Inhalte garantiert innerhalb von Minuten sichtbar waren.
Lektion: Verwende Cron für periodische „Aufräum“-Aufgaben wie die Cache-Invalidierung, um Systeme frisch und performant zu halten.
Häufige Fehler und Fallen
Zeitzonen-Ärger: Ein klassisches „Es läuft zur falschen Zeit“-Problem. Cronjobs laufen fast immer mit der Systemzeit des Servers, die UTC oder eine andere Zeitzone sein kann, in der du dich nicht befindest. Einen Job für
9Uhr deiner Zeit zu planen, könnte bedeuten, dass er um 14 Uhr Serverzeit läuft. Sei dir immer der Zeitzone deines Servers bewusst.Der Konflikt zwischen Tag-des-Monats und Wochentag: Ein häufiger Anfängerfehler ist es, einen Wert in beide Felder, Tag-des-Monats und Wochentag, einzutragen (z.B.
* * 1 FRI). Die meisten Cron-Daemons interpretieren dies mit einerODER-Bedingung: „Führe am 1. des Monats ODER an jedem Freitag aus.“ Das ist selten das, was man will. Wenn du „den ersten Freitag des Monats“ willst, musst du* * ? * 5#1oder ein komplexeres Skript verwenden. Benutze das?-Zeichen, um Mehrdeutigkeiten zu vermeiden.Vergessene Ausgabeumleitung: Standardmäßig wird alles, was dein Skript auf die Standardausgabe oder Standardfehlerausgabe druckt, per E-Mail an den Benutzer gesendet, dem die Crontab gehört. Das klingt hilfreich, kann aber schnell ein Postfach mit nutzlosen Benachrichtigungen füllen. Best Practice ist es, die Ausgabe explizit zu behandeln: leite sie in eine Log-Datei um (
>> /var/log/myjob.log 2>&1) oder verwerfe sie, wenn sie dir egal ist (> /dev/null 2>&1).Der überlappende Job: Einen Job auf
* * * * *zu setzen, bedeutet „starte zu Beginn jeder Minute eine neue Instanz dieses Jobs“. Wenn dein Job 90 Sekunden zum Ausführen benötigt, kommt es zu überlappenden Ausführungen, was zu Race Conditions, Ressourcenerschöpfung und allerlei Chaos führen kann.Die minimalistische Umgebung: Deine interaktive Shell ist voll von hilfreichen Umgebungsvariablen wie
$PATH. Ein Cronjob läuft in einer kahlen, abgespeckten Umgebung. Dein Skript, das von der Kommandozeile aus perfekt läuft, könnte in Cron fehlschlagen, weil es Programme wienodeoderpythonnicht finden kann. Die Lösung ist, absolute Pfade für alle Befehle zu verwenden (z. B./usr/bin/nodeanstelle vonnode) oder diePATH-Variable am Anfang deiner Crontab-Datei zu setzen.
Warum du es auf dem Schirm haben solltest
Du denkst vielleicht, Cron sei nur etwas für Systemadministratoren der alten Schule, aber seine DNA ist überall.
- Backend & DevOps: Es ist der De-facto-Standard für die Planung von Hintergrundjobs, von der Datenbankwartung und Log-Rotation bis hin zum Deployment von Code.
- Webentwicklung: Du musst tägliche E-Mail-Berichte senden, einen Cache leeren oder eine Sitemap generieren? Cron ist dein Werkzeug.
- Cloud-Plattformen: Dienste wie AWS Lambda Scheduled Events und Google Cloud Scheduler verwenden Cron-Expressions, um ihre Trigger zu definieren. Die Syntax ist eine universelle Sprache für die Zeitplanung, selbst in den modernsten, „serverless“ Umgebungen.
Cron-Expressions lesen und schreiben zu lernen ist eine grundlegende Fähigkeit. Es ist der Schlüssel, der die Automatisierung erschließt und es dir ermöglicht, robustere, zuverlässigere und autarkere Systeme zu bauen. Es ist eines dieser kleinen Dinge, bei denen du, sobald du sie kennst, überall Gelegenheiten sehen wirst, sie zu nutzen.
Tauche tiefer ein
- Wikipedia: cron - Die Geschichte und ein Überblick über das cron-Utility selbst.
- crontab(5) - Linux man page - Die kanonische, technische Referenz für das Dateiformat und seine Syntax.
- Crontab Guru - Ein interaktiver Online-Editor für Cron-Expressions, der sie in einfaches Englisch übersetzt. Unverzichtbar, um die eigene Arbeit zu überprüfen.
- The Open Group Base Specifications: crontab - Der POSIX-Standard, der definiert, was ein
crontabtun sollte. - Quartz CronTrigger Tutorial - Ein Deep Dive in einen beliebten Java-basierten Scheduler, der ein erweitertes Cron-Expression-Format verwendet, einschließlich Sekunden und weiterer Sonderzeichen.