0 0 1 * * lässt den Auftrag einmal im Monat laufen, am Ersten um 0:00 Uhr. Das dritte Feld legt den Tag im Monat fest, Monat und Wochentag bleiben offen. Der Lauf kommt also zwölfmal im Jahr, gleich auf welchen Wochentag der Erste fällt. Die Kurzform @monthly meint genau diese Zeile.
Wie lasse ich einen Auftrag am letzten Tag des Monats laufen?
Mit dem Tagesfeld allein gar nicht: 0 0 31 * * überspringt jeden Monat mit 30 Tagen und den Februar ganz. Der übliche Kniff ist, täglich zu laufen und das Skript entscheiden zu lassen: 0 23 28-31 * * zusammen mit einer Prüfung wie [ "$(date -d tomorrow +%d)" = "01" ] trifft nur den tatsächlich letzten Tag, welche Zahl er auch trägt.
Was passiert, wenn ich einen Wochentag ergänze?
Er läuft weit häufiger als gedacht. 0 0 1 * 1 bedeutet nicht „am Ersten, sofern es ein Montag ist“ – sind beide Tagesfelder eingeschränkt, verknüpft Cron sie mit ODER, der Auftrag läuft also am Ersten und an jedem Montag, rund fünfmal im Monat. Freitag, der 13., lässt sich in Cron gar nicht ausdrücken; das braucht eine Datumsprüfung im Skript.
Ist der Erste ein guter Tag für monatliche Abrechnungsläufe?
Er ist die naheliegende Wahl und deshalb der vollste Tag: Rechnungen, Berichte, Kontingent-Rücksetzungen und Lizenzprüfungen häufen sich dort, auf der eigenen Maschine wie bei jedem Dienst, den man anspricht. Hängt der Lauf an Daten, die erst nachts vollständig sind, ist der Zweite um 4 Uhr oft der ruhigere und verlässlichere Platz – Cron kennt keinen zweiten Versuch, ein Fehlschlag wartet einen ganzen Monat.
So trägst du den Ausdruck ein
- Den Tag ins dritte Feld schreiben und das Wochentagsfeld auf Stern lassen, sonst verdoppelt die ODER-Regel den Plan.
- Die Zeile 0 0 1 * * samt Befehl eintragen – oder @monthly, wenn das Datum dauerhaft feststeht.
- Für den Monatsletzten 28-31 planen und im Skript prüfen, ob morgen der Erste ist.
- Bei Fehlschlag alarmieren: Ein still gescheiterter Monatsauftrag fällt sonst erst im nächsten Quartal auf.