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.

1voto

Piran Points 113

As far as I know it is NOT possible using only crontab, however one can use a wrapper function to pick the correct day from a "first seven days of month" contab entry; see this from entry.

Le script 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 que son nom est wrapper.sh et qu'il est disponible globalement) en utilisant l'entrée de crontab

0 0 * * 1 wrapper.sh

1voto

Will Points 11

Sous Solaris 10, j'ai dû formater la condition comme suit :

[ `date +\%a` = "Sam" ] && echo "C'est samedi"

1voto

simer Points 153

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

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

Le code ci-dessus devrait fonctionner pour vous.

1voto

Manus Freedom Points 11

Je recommande d'utiliser

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

au lieu de

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

pour éviter les problèmes de localisation.

0voto

Seldaek Points 126

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

Vous pouvez l'utiliser de cette manière :

30 06 * * lun run-if-today 1 "lun" && echo "Premier lundi"
30 06 * * jeu run-if-today 3 "jeu" && echo "Troisième jeudi"
30 06 * * dim run-if-today D "dim" && echo "Dernier dimanche"

Le script run-if-today vérifie à la fois le jour de la semaine et la plage de dates souhaitée de la semaine, s'ils correspondent tous les deux, il renvoie 0, sinon 1.

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

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