Der Ausdruck 0 0 1 * *
Der Cron-Ausdruck 0 0 1 * * wird in Minute 0, Stunde 0, am Tag 1 jedes Monats ausgelöst, unabhängig davon, welcher Monat oder welches Jahr es ist. Der Job läuft um Mitternacht am 1. Januar, 1. Februar, 1. März und so weiter, genau 12 Mal pro Jahr.
| Feld | Wert | Bedeutung |
|---|---|---|
| Minute | 0 | Zu Beginn der Stunde |
| Stunde | 0 | Mitternacht |
| Tag des Monats | 1 | Der 1. Tag des Monats |
| Monat | * | Jeden Monat |
| Wochentag | * | Jeden Tag |
Der Alias @monthly
@monthly ist die Kurzform für 0 0 1 * *:
@monthly /opt/jobs/billing-cycle
# gleichbedeutend mit:
0 0 1 * * /opt/jobs/billing-cycle
Eckfälle mit Monatstagswerten
Monate mit weniger als 31 Tagen
Wenn du einen Job auf Tag 29, 30 oder 31 planst, wird er für Monate, die diese Tage nicht haben, stillschweigend übersprungen:
| Ausdruck | Übersprungene Monate |
|---|---|
0 0 29 * * | Februar (in den meisten Jahren) |
0 0 30 * * | Februar |
0 0 31 * * | Feb, Apr, Jun, Sep, Nov |
Schaltjahr und 29. Februar
0 0 29 * * überspringt den Februar in Nicht-Schaltjahren vollständig.
Das Problem des letzten Monatstags
Praktische Lösung: Führe den Job täglich aus und prüfe das Datum im Skript:
#!/bin/bash
if [ "$(date -d tomorrow +%d)" != "01" ]; then
exit 0
fi
# eigentliche Job-Logik hier
Reale Anwendungsfälle für monatliches Cron
Abrechnung und Rechnungsstellung
Rechnungen generieren, Abonnementverlängerungen verarbeiten oder nutzungsbasierte Gebühren neu berechnen.
Monatsberichte
Finanz-, Verkaufs- und Betriebsberichte, die Daten des Vormonats zusammenfassen.
Datenarchivierung
Daten, die älter als ein Monat sind, in Kaltlagerung verschieben.
Zertifikats- und Schlüsselrotation
API-Schlüssel, Aktualisierungstokens oder Geheimnisse in monatlichem Rhythmus rotieren.
Überprüfen der Planung
from croniter import croniter
from datetime import datetime
cron = croniter("0 0 1 * *", datetime.now())
for _ in range(5):
print(cron.get_next(datetime))