web-dev-qa-db-fra.com

Exécuter une tâche cron le premier lundi de chaque mois?

J'aimerais commencer un travail chez cron à 8h30 le premier lundi de chaque mois. La page Wikipedia cron dit

Bien que le travail soit normalement exécuté lorsque les champs de spécification heure/date correspondent tous à l'heure et à la date actuelles, il existe une exception: si le "jour du mois" et le "jour de la semaine" sont tous deux restreints (et non "*"), alors Le champ "Jour du mois" (3) ou le champ "Jour de la semaine" (5) doit correspondre au jour actuel.

(mon emphase)

Est-ce que cela signifie que je ne peux pas faire le premier lundi du mois, je ne peux faire que le premier (ou peu importe) jour du mois? Je ne peux pas penser à un moyen de le contourner.

28
Max Williams

Vous pouvez mettre la condition dans la commande crontab actuelle:

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

Maintenant, si cette condition est vraie l'un des sept premiers jours du mois, vous avez son premier lundi. Notez que dans la crontab, la syntaxe pour cent doit être échappée si:

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

Remplacez la commande echo par la commande à exécuter. J'ai aussi trouvé une approche similaire .

37
slhck

J'ai un ordinateur avec des paramètres régionaux en espagnol, cette approche ne fonctionne donc pas pour moi car mon devient lun

D'autres langues échoueraient également. J'ai donc légèrement modifié la réponse acceptée qui élimine la barrière de la langue:

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

Je trouve cela plus facile quand il n'y a pas besoin de gérer les numéros de jours.

Courez le premier lundi du mois:

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

c'est-à-dire si le mois d'il y a une semaine n'est pas le même que le mois en cours, nous sommes le premier jour 1 (= lundi) du mois.

De même, pour le troisième vendredi

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

c'est-à-dire que si le mois précédent est différent du mois en cours, nous sommes le 3ème jour du vendredi 6 (= vendredi)

7
joel

J'ai planifié l'exécution d'un travail le 4ème lundi de chaque mois à 4h00 PM comme suit:

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

Autant que je sache, il n'est PAS possible d'utiliser uniquement crontab. Toutefois, vous pouvez utiliser une fonction wrapper pour choisir le jour correct dans une entrée de liste de contrôle "premiers sept jours du mois"; voir ceci depuis l'entrée.

Le script de wrapper serait

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

et vous auriez besoin de l'exécuter (en supposant qu'il s'appelle wrapper.sh et globalement disponible) à l'aide de l'entrée crontab

0 0 * * 1 wrapper.sh
1
elemakil

Vous pouvez essayer d'exécuter cronjob pendant les sept premiers jours du mois et le laisser s'exécuter uniquement le lundi.

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

Ci-dessus devrait fonctionner pour vous.

1
simer

Je recommande d'utiliser

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

au lieu de

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

pour éviter le problème de la localisation.

1
Manus Freedom

J'ai fait une solution générale pour ce genre de problèmes, cela fonctionne pour le premier, deuxième, troisième ..... dernier jour de la semaine du mois.

Vous pouvez l'utiliser comme ceci:

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"

Le script exécute-si-aujourd'hui recherche à la fois le jour de la semaine et la plage de dates de la semaine souhaitée. Si les deux correspondent, il renvoie 0, sinon 1.

Vérifiez le code ici. https://github.com/xr09/cron-last-sunday

0
MGP
0 9 1-7 * 1 * 

Cela fonctionnera pour chaque lundi de chaque mois.

0
SIBHI S

Sous Solaris 10, je devais formater la condition comme suit:

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

Depuis que j'interprète mes instructions cron en utilisant php et js, je ne peux pas utiliser bash. Finalement, j'ai trouvé que est possible avec juste cron:

0 30 8 * 1/1 MON#1

J'espère que ceci aide quelqu'un d'autre. Quoi qu'il en soit, je vous souhaite à tous une belle journée. :-)

0
kramer65

Je crois que cela résout le problème plus élégamment:

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