it-swarm.com.de

Jeden ersten Montag im Monat einen Cron-Job ausführen?

Ich möchte jeden ersten Montag im Monat um 8.30 Uhr einen Job von cron ausführen. Die Cron Wikipedia Seite sagt

Während der Job normalerweise ausgeführt wird, wenn die Zeit-/Datumsangaben alle mit der aktuellen Uhrzeit und dem aktuellen Datum übereinstimmen, gibt es eine Ausnahme: Wenn sowohl "Tag des Monats" als auch "Wochentag" eingeschränkt sind (nicht "*"), dann entweder das Feld "Tag des Monats" (3) oder das Feld "Tag der Woche" (5) muss mit dem aktuellen Tag übereinstimmen.

(meine Betonung)

Heißt das, ich kann den ersten Montag des Monats nicht machen, ich kann nur den ersten (oder was auch immer) Tag des Monats machen? Ich kann mir keinen Ausweg vorstellen.

28
Max Williams

Sie können die Bedingung in den aktuellen Befehl crontab einfügen:

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

Wenn diese Bedingung an einem der ersten sieben Tage eines Monats erfüllt ist, haben Sie den ersten Montag. Beachten Sie, dass in der Crontab die Prozent-Syntax jedoch maskiert werden muss:

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

Ersetzen Sie den Befehl echo durch den tatsächlichen Befehl, den Sie ausführen möchten. Ich fand auch einen ähnlichen Ansatz .

37
slhck

Ich habe einen Computer mit der Ländereinstellung Spanisch, daher funktioniert dieser Ansatz bei mir nicht, da von Montag auf geändert wird. Lun

Andere Sprachen würden ebenfalls scheitern. Daher habe ich die akzeptierte Antwort leicht abgewandelt, um die Sprachbarriere zu überwinden:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"
11
cumanacr

Ich finde es einfacher, wenn es nicht nötig ist, mit Tageszahlen umzugehen.

Führen Sie den ersten Montag im Monat aus:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

d. h., wenn der Monat vor 1 Woche nicht mit dem aktuellen Monat übereinstimmt, befinden wir uns am 1. Tag 1 (= Montag) des Monats.

Ähnliches gilt für den dritten Freitag

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

d. h., wenn der Monat vor 3 Wochen vom aktuellen Monat abweicht, sind wir am 3. Tag 6 (= Freitag) des Monats

7
joel

Ich habe einen Auftrag für den 4. Montag eines jeden Monats um 16:00 Uhr PM wie folgt eingeplant:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt
4

Soweit ich weiß, ist es NICHT möglich, nur crontab zu verwenden. Sie können jedoch eine Wrapper-Funktion verwenden, um den richtigen Tag aus einem Contab-Eintrag für die ersten sieben Tage im Monat auszuwählen. siehe dieses vom Eintrag.

Das Wrapper-Skript wäre

#! /usr/bin/ksh
day=$(date +%d)
if ((day <= 7)) ; then
   exec somecommand
fi
exit 1

und Sie müssten es mit dem Eintrag crontab ausführen (vorausgesetzt, es heißt wrapper.sh und ist global verfügbar)

0 0 * * 1 wrapper.sh
1
elemakil

Sie können versuchen, Cronjob für die ersten sieben Tage des Monats auszuführen und es nur am Montag ausführen zu lassen.

30 8 * * 1 [`date +\%d` -le 07] && <job>

Oben sollte für dich funktionieren.

1
simer

Ich empfehle zu verwenden

"$(/bin/date '+%\w')" = "1"

anstatt

"$(date '+\%a')" = "Mon"

um ein Problem mit dem Gebietsschema zu vermeiden.

1
Manus Freedom

Ich habe eine allgemeine Lösung für diese Art von Problemen gefunden. Sie funktioniert für den ersten, zweiten, dritten ... letzten Wochentag des Monats.

Du kannst es so benutzen:

30 06 * * Mon run-if-today 1 "Mon" && echo "First Monday"
30 06 * * Thu run-if-today 3 "Thu" && echo "Third Thursday"
30 06 * * Sun run-if-today L "Sun" && echo "Last Sunday"

Das Skript prüft, ob der Wochentag und der gewünschte Wochentag übereinstimmen. Wenn beide übereinstimmen, wird 0 zurückgegeben, andernfalls 1.

Überprüfen Sie den Code hier. https://github.com/xr09/cron-last-sunday

0
MGP
0 9 1-7 * 1 * 

Dies funktioniert jeden Montag im Monat.

0
SIBHI S

Unter Solaris 10 musste ich die Bedingung wie folgt formatieren:

[ `date +\%a` = "Sat" ] && echo "It's Saturday"
0
Will

Da ich meine cron-Anweisungen mit php und js interpretiere, kann ich bash nicht verwenden. Endlich habe ich festgestellt, dass es tatsächlich mit nur cron möglich ist :

0 30 8 * 1/1 MON#1

Hoffe das hilft jemand anderem. Trotzdem wünsche ich Ihnen allen einen schönen Tag. :-)

0
kramer65

Ich glaube, das löst das Problem eleganter:

30 8 1-7 * 1 /run/your/job.sh
0
symcbean