43 votes

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

Je voudrais exécuter un travail à partir de cron à 8h30 le premier lundi de chaque mois. La page Wikipedia de cron dit

Alors que normalement le travail est exécuté lorsque les champs de spécification du temps/date concordent tous avec le temps et la date actuels, il y a une exception : si à la fois "jour du mois" et "jour de la semaine" sont restreints (pas "*"), alors soit le champ "jour du mois" (3) ou le champ "jour de la semaine" (5) doit correspondre au jour actuel.

(mon soulignement)

Cela signifie-t-il que je ne peux pas faire le premier lundi du mois, je ne peux faire que le premier (ou autre) jour du mois ? Je ne vois pas de solution.

50voto

slhck Points 209720

Vous pouvez mettre la condition dans la commande crontab actuelle (manière générique) :

[ "$(date '+%u')" = "1" ] && echo "C'est lundi"

si votre locale est EN/US, vous pouvez également comparer les chaînes (réponse initiale) :

[ "$(date '+%a')" = "Mon" ] && echo "C'est lundi"

Maintenant, si cette condition est vraie l'un des sept premiers jours du mois, vous avez son premier lundi. Notez que dans le crontab, la syntaxe en pourcentage doit toutefois être échappée (manière générique) :

0   12  1-7 *   *   [ "$(date '+\%u')" = "1" ] && echo "C'est lundi"

si votre locale est EN/US, vous pouvez également comparer les chaînes (réponse initiale) :

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "C'est lundi"

Remplacez la commande echo par la commande réelle que vous souhaitez exécuter. J'ai trouvé une approche similaire aussi.

24voto

cumanacr Points 341

J'ai un ordinateur avec la locale en espagnol, donc, cette approche ne fonctionne pas pour moi parce que mon se transforme en lun

D'autres langues échoueraient également, donc, j'ai apporté une légère variation à la réponse acceptée qui élimine la barrière linguistique:

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

10voto

joel Points 101

Je trouve ça plus facile lorsqu'il n'est pas nécessaire de gérer les chiffres des jours.

Exécution du premier lundi du mois :

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 semaine auparavant"` ] || /chemin/vers/commande

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

De même, pour le troisième vendredi

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 semaines auparavant"` ] || /chemin/vers/commande

c'est-à-dire si le mois de 3 semaines auparavant est différent du mois actuel, alors nous sommes le 3ème jour 6 (= vendredi) du mois

5voto

frank Points 51

J'ai programmé une tâche pour s'exécuter le quatrième lundi de chaque mois à 16h00 comme suit :

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

2voto

kramer65 Points 1224

Comme j'interprète mes déclarations cron en utilisant php et js, je ne peux pas utiliser bash. Enfin, j'ai découvert que c'est en fait possible avec juste cron:

0 30 8 * 1/1 MON#1

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X