![Am ersten Montag jedes Monats einen Cron-Job ausführen?](https://rvso.com/image/1316111/Am%20ersten%20Montag%20jedes%20Monats%20einen%20Cron-Job%20ausf%C3%BChren%3F.png)
Ich möchte jeden ersten Montag im Monat um 8.30 Uhr einen Job von Cron ausführen. Auf der Cron-Wikipedia-Seite steht
Normalerweise wird der Job ausgeführt, wenn alle Zeit-/Datumsfelder mit der aktuellen Uhrzeit und dem aktuellen Datum übereinstimmen. Es gibt jedoch eine Ausnahme: Wenn sowohl „Tag des Monats“ als auch „Wochentag“ eingeschränkt sind (nicht „*“), dannentwederDas Feld „Tag des Monats“ (3) bzw. das Feld „Wochentag“ (5) muss mit dem aktuellen Tag übereinstimmen.
(meine Hervorhebung)
Bedeutet das, dass ich den ersten Montag im Monat nicht machen kann, sondern nur den ersten (oder einen beliebigen anderen) Tag im Monat? Mir fällt keine Möglichkeit ein, das zu umgehen.
Antwort1
Sie können die Bedingung in den eigentlichen Crontab-Befehl einfügen (allgemeine Methode):
[ "$(date '+%u')" = "1" ] && echo "It's Monday"
Wenn Ihr Gebietsschema EN/US ist, können Sie auch Zeichenfolgen vergleichen (erste Antwort):
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
Wenn diese Bedingung nun an einem der ersten sieben Tage eines Monats zutrifft, ist es der erste Montag. Beachten Sie, dass in der Crontab die Prozentsyntax maskiert werden muss (allgemeine Vorgehensweise):
0 12 1-7 * * [ "$(date '+\%u')" = "1" ] && echo "It's Monday"
Wenn Ihr Gebietsschema EN/US ist, können Sie auch Zeichenfolgen vergleichen (erste Antwort):
0 12 1-7 * * [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
Ersetzen Sie den echo
Befehl durch den eigentlichen Befehl, den Sie ausführen möchten. Ich fand eineähnlicher Ansatzzu.
Antwort2
Ich habe einen Computer mit Lokalisierung auf Spanisch, also funktioniert dieser Ansatz für mich nicht, weilMoÄnderungen anMontag
Auch bei anderen Sprachen würde es nicht funktionieren, deshalb habe ich die akzeptierte Antwort leicht abgewandelt, um die Sprachbarriere zu beseitigen:
0 9 1-7 * * [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"
Antwort3
Ich finde es einfacher, wenn ich nicht mit Tagesnummern hantieren muss.
Ausführung am ersten Montag des Monats:
0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command
d. h. wenn der Monat vor 1 Woche nicht derselbe ist wie der aktuelle Monat, dann befinden wir uns am 1. Tag 1 (= Montag) des Monats.
Ebenso für den dritten Freitag
0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command
Wenn also der Monat vor 3 Wochen nicht mit dem aktuellen Monat übereinstimmt, dann befinden wir uns am 3. Tag 6 (= Freitag) des Monats
Antwort4
Ich habe einen Job so geplant, dass er jeden vierten Montag im Monat um 16:00 Uhr wie folgt ausgeführt wird:
0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt