Der Ausdruck 0 0 * * 1-5
Der Cron Ausdruck 0 0 * * 1-5 löst um Mitternacht, Montag bis Freitag aus. Feldaufschlüsselung: Minute (0), Stunde (0), Tag des Monats (*), Monat (*), Wochentag (1-5). Mitternacht an Werktagen ist eine übliche Basis. Die meisten Teams passen das Stundenfeld an ihre tatsächlichen Bedürfnisse an. Das Kernkonzept hier ist der Bereich 1-5 im Wochentagsfeld, was diese Seite lesenswert macht, unabhängig davon, welche Uhrzeit du einstellst.
Der Bereich 1-5 im Wochentagsfeld
Der Wochentag im POSIX Cron ist das fünfte Feld und verwendet die folgende Nummerierung:
| Nummer | Tag |
|---|---|
| 0 | Sonntag |
| 1 | Montag |
| 2 | Dienstag |
| 3 | Mittwoch |
| 4 | Donnerstag |
| 5 | Freitag |
| 6 | Samstag |
| 7 | Sonntag (Alias) |
Der Bereich 1-5 trifft Montag bis Freitag. Samstag (6) und Sonntag (0 oder 7) sind ausgeschlossen. Dies ist der Mechanismus hinter jedem “nur an Geschäftstagen ausführen” Cron Ausdruck, dem du begegnen wirst.
MON-FRE Alias
In Vixie cron und den meisten modernen Implementierungen funktionieren dreibuchstabige Abkürzungen im Wochentagsfeld:
0 0 * * MON-FRE # identisch zu 0 0 * * 1-5
0 0 * * MON,MIE,FRE # nur Montag, Mittwoch, Freitag
0 0 * * DIE,DON # Dienstag und Donnerstag
Benannte Aliase verbessern die Lesbarkeit in gemeinsam genutzten crontabs. Sie funktionieren in cronie (dem Standard auf RHEL/CentOS/Fedora), Vixie cron (Debian/Ubuntu) und den meisten verwalteten Cloud Schedulern. Wenn die Portabilität über minimale oder eingebettete Cron Implementierungen wichtig ist, verwende Zahlen.
Warum Nur-Werktag Zeitpläne existieren
Der Hauptgrund ist die menschliche Verfügbarkeit. Automatisierte Systeme, die benachrichtigen, alarmieren oder bereitstellen, sollten berücksichtigen, ob jemand in der Nähe ist, um zu reagieren. Häufige Fälle:
Geschäftsprozess Automatisierung
Rechnungserstellung, Berichtsverteilung und Datenabgleichsjobs, die in Workflows einfließen, an denen Menschen täglich arbeiten, müssen nicht am Wochenende laufen, wenn die Ausgabe ungelesen bis Montag liegen bleibt.
Bereitstellungen und Alarme
Viele Teams schränken Produktionsbereitstellungen auf Werktage ein, damit ein Ingenieur verfügbar ist, um bei Problemen zurückzusetzen. Ein Bereitschaftsalarm um 2 Uhr Samstag ist weniger nützlich, wenn das Team bis Montag nicht verfügbar ist.
Ressourcenkosten
Wenn ein Job nachgelagerte Verarbeitung, API Aufrufe oder externe Dienste auslöst, spart der Betrieb an fünf statt sieben Tagen pro Woche etwa 28% der Betriebskosten für diese Komponente.
SLA abgestimmte Verarbeitung
Jobs, die an Geschäfts SLAs gebunden sind (Zahlungsverarbeitungsfenster, Tagesabschlussabstimmung, Geschäftszeiten Berichte), sind von Natur aus nur an Werktagen aktiv, da das zugrunde liegende SLA es ist.
Feiertage werden von Cron nicht behandelt
Cron hat keine Kenntnis von gesetzlichen Feiertagen. Ein mit 1-5 geplanter Job wird an Weihnachten und Neujahr ausgeführt, wenn sie auf einen Werktag fallen. Wenn das ein Problem ist, liegt die Lösung auf der Anwendungsebene:
#!/bin/bash
# Feiertagsliste vor der Ausführung überprüfen
FEIERTAGS_DATEI="/etc/feiertage.txt"
HEUTE=$(date +%Y-%m-%d)
if grep -q "$HEUTE" "$FEIERTAGS_DATEI"; then
echo "Überspringe: $HEUTE ist ein Feiertag"
exit 0
fi
# Den eigentlichen Job ausführen
/opt/jobs/business-report
Verwalte die Feiertagsdatei als Teil deiner Infrastrukturkonfiguration. Einige Teams generieren sie jährlich aus einer Kalender API (wie der Google Calendar API oder einer länderspezifischen Feiertags API) und stellen sie zusammen mit ihren crontabs bereit.
Häufige Werktag Muster
Die Basis 0 0 * * 1-5 wird fast immer angepasst. Dies sind die Muster, die tatsächlich in Produktions crontabs vorkommen:
Täglicher Job zu einer bestimmten Geschäftszeit:
0 9 * * 1-5 # 9 Uhr Werktage, Morgenjob vor dem Standup
0 6 * * 1-5 # 6 Uhr Werktage, Daten vorbereiten vor Geschäftsbeginn
0 18 * * 1-5 # 18 Uhr Werktage, Tagesabschlussverarbeitung
Intervall innerhalb der Geschäftszeiten:
*/15 9-17 * * 1-5 # alle 15 Min, 9 bis 17 Uhr, Werktage
*/30 8-18 * * 1-5 # alle 30 Min während erweiterter Geschäftszeiten
0 * 9-17 * * 1-5 # zu jeder vollen Stunde während der Geschäftszeiten
Mehrere feste Zeiten an Werktagen:
0 9,12,17 * * 1-5 # 9 Uhr, 12 Uhr und 17 Uhr Werktage
0 8,16 * * 1-5 # zweimal täglich zu Schichtgrenzen
Nur Montag oder nur Freitag:
0 0 * * 1 # Mitternacht Montag, wöchentlicher Startjob
0 23 * * 5 # 23 Uhr Freitag, Wochenendbereinigung vor dem Wochenende
Interaktion zwischen Tag des Monats und Wochentag
Ein wichtiger Cron Randfall: Wenn sowohl das Tag des Monats Feld als auch das Wochentagsfeld explizit gesetzt sind (keines ist *), führt Cron den Job auf der Vereinigungsmenge beider Einschränkungen aus, nicht auf der Schnittmenge.
0 0 15 * 1-5 # läuft am 15. jedes Monats UND an jedem Werktag
Dies bedeutet nicht “Werktage, die auf den 15. fallen.” Es bedeutet “jeden Werktag plus den 15. jedes Monats.” Wenn du die Ausführung auf eine bestimmte Kombination beschränken möchtest, benötigst du Skriptlogik, keinen komplexeren Cron Ausdruck.
Bei 0 0 * * 1-5 ist der Tag des Monats *, daher trifft dieser Randfall nicht zu.
Den Zeitplan überprüfen
from croniter import croniter
from datetime import datetime
cron = croniter("0 0 * * 1-5", datetime.now())
for _ in range(7):
print(cron.get_next(datetime))
Führe 7 Iterationen durch und du wirst sehen, dass der Zeitplan Samstag und Sonntag überspringt. Verwende den Cron Builder auf dieser Seite, um die nächsten 10 Laufzeiten interaktiv anzuzeigen.