Am ersten Montag jedes Monats einen Cron-Job ausführen?

Am ersten Montag jedes Monats einen Cron-Job ausführen?

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 echoBefehl 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

verwandte Informationen