Cron · Zeitsteuerung · Unix
Was ist Cron genau?
Ein Cron-Eintrag besteht aus fünf Zeitfeldern und einem Befehl. In dieser Reihenfolge: Minute, Stunde, Tag des Monats, Monat, Wochentag.
30 4 * * 1 /usr/local/bin/backup.sh Das liest sich: Minute 30, Stunde 4, jeder Tag des Monats, jeder Monat, Wochentag 1. Halb fünf morgens, montags.
Das Vokabular eines Feldes
Jedes Feld nimmt mehr als eine einzelne Zahl. * heißt jeder Wert. 1-5 ist ein Bereich. 1,15 ist eine Liste. */15 ist eine Schrittweite - jeder fünfzehnte Wert, im Minutenfeld also viermal pro Stunde.
Zwei Felder nehmen auch Namen an: Monate von JAN bis DEC, Wochentage von SUN bis SAT. Und das Wochentagsfeld hat eine bekannte Eigenheit: sowohl 0 als auch 7 bedeuten Sonntag, in den meisten Implementierungen.
Das Feld, das ein ODER ist
Hier ist der Teil, der überrascht, und er verdient ein zweites Lesen.
Tag des Monats und Wochentag sind zwei verschiedene Arten, denselben Tag zu benennen. Füllen Sie nur eines davon aus und lassen das andere auf *, verhält sich Cron genau wie erwartet. Füllen Sie beide aus, legt POSIX fest, dass ein Tag, der auf eines von beiden passt, die Aufgabe auslöst.
Es ist ein ODER, kein UND.
0 0 1 * 1 bedeutet also nicht „am Ersten des Monats, wenn es ein Montag ist". Es bedeutet am Ersten jedes Monats und an jedem Montag - grob das Fünffache der beabsichtigten Läufe.
Die Begründung für diese Wahl ist vertretbar. Ein UND ließe die meisten Kombinationen fast nie feuern: „der 31., wenn er auf einen Freitag fällt" kommt ein- bis zweimal im Jahr vor. Das ODER erlaubt einer einzigen Zeile, „monatlich und wöchentlich" auszudrücken, ohne zweiten Eintrag. Aber es ist das Gegenteil dessen, was die Syntax nahelegt, und genau dort laufen geplante Aufgaben still an den falschen Tagen.
Die Kurzformen, und warum sie nicht portabel sind
Viele Implementierungen akzeptieren @daily, @hourly, @weekly, @monthly und @reboot. Sie sind bequem und nicht Teil von POSIX - sie stammen von Vixie cron und dessen Nachfahren.
Auf einer Maschine, die Ihnen gehört, ist das gleichgültig. In etwas, das überall laufen muss - ein Container-Image, ein Skript, das Sie weitergeben - sind die fünf ausgeschriebenen Felder die sichere Wahl. @reboot hat im Standard gar keine Entsprechung, und sein Verhalten hängt vollständig von der Implementierung ab.
Was Cron nicht tut
Es holt nichts nach. War die Maschine um 4:30 aus, lief die 4:30-Aufgabe nicht und wird nicht nachgeholt. Cron feuert bei Übereinstimmung mit der Uhr und führt keine Warteschlange verpasster Arbeit.
Es gibt Ihnen nicht Ihre Anmeldeumgebung. Eine Cron-Aufgabe läuft mit minimalem PATH und ohne Ihr Shell-Profil. Das häufigste „im Terminal geht es, in Cron nicht" ist ein Befehl, der über einen PATH gefunden wurde, den Cron nicht hat. Nehmen Sie absolute Pfade.
Es verhindert keine Überschneidung. Braucht eine alle fünf Minuten geplante Aufgabe sechs, laufen zwei Kopien gleichzeitig. Cron startet die nächste ungeachtet dessen; die Sperrdatei ist Ihre Sache, nicht seine.
Es sagt Ihnen nicht, dass es fehlgeschlagen ist. Die Ausgabe geht per Mail hinaus, sofern Mail eingerichtet ist, und sonst ins Nichts. Leiten Sie in eine Logdatei um und sehen Sie hinein, sonst erfahren Sie es am fehlenden Backup.
Lesen Sie den Ausdruck, bevor Sie ihm trauen
Weil das ODER in der Syntax unsichtbar ist, kann ein Ausdruck richtig aussehen und auf eine Weise falsch sein, die sich erst Wochen später zeigt. Ihn vor dem Ausrollen Feld für Feld zu entschlüsseln kostet Sekunden - dafür gibt es den Cron-Ausdruck-Decoder auf dieser Seite.
Ein Kalender mit Wochentagsnamen an der Seite und Tageszahlen im Raster. Cron hat für beides ein Feld, und wenn Sie beide ausfüllen, trifft es auf das eine ODER das andere zu - nicht auf beide zusammen.