3 votes

Pourquoi mon cronjob a été lancé le mauvais jour ?

Je voulais lancer un travail au début de chaque mois, mais seulement les jours de semaine.

Pour ce faire, j'ai ajouté cette ligne dans le fichier /etc/crontab :

7 0 3-5 * 1-5  root  ( test "`date '+\%d'`" = "03" || test "`date '+\%u'`" = "1" ) && /path/to/my/script.sh

Ce qui était attendu : script.sh lancé le 1er jour de la semaine entre le 3 et le 5 du mois (la partie "test" n'est là que pour être sûr qu'il est lancé une fois).

Cela fonctionne très bien et ce mois-ci, le 3, le cronjob a été exécuté.

Mais, malheureusement, pour une raison inconnue, il a également été lancé aujourd'hui, le 8 juin, le lundi. Je peux comprendre que la partie "test" fonctionne ( test "date '+%u'" = "1" est vrai, et c'est logique), mais la partie "cron" ne devrait pas être vraie ( 7 0 3-5 * 1-5 n'est pas vrai, nous sommes le 8ème).

Je me demandais donc si j'avais fait quelque chose de mal, ou s'il y avait un problème plus profond ?

Merci !

4voto

Stewart Points 1385

Ce comportement, certes surprenant, est documenté dans man 5 crontab (c'est moi qui souligne) :

Les commandes sont exécutées par cron(8) lorsque la minute, l'heure et le mois sont affichés. de l'année correspondent à l'heure actuelle, et quand au moins un de les deux champs de jour (jour du mois ou jour de la semaine) correspondent à la date actuelle de la l'heure actuelle (voir "Note" ci-dessous).

[...]

Note : Le jour d'exécution d'une commande peut être spécifié par deux champs - le jour du mois et le jour de la semaine. champs - jour du mois et jour de la semaine. Si les deux champs sont restreints (c'est-à-dire qu'ils ne sont pas *), la commande sera exécutée lorsque soit
correspond à l'heure actuelle
. Par exemple, "30 4 1,15 * 5". ferait en sorte qu'une commande soit exécutée à 4h30 du matin le 1er et le 15 de chaque mois, plus chaque vendredi.

Donc, ce que vous devez faire, c'est que votre commande teste le temps. Tout comme vous le faites pour qu'elle ne s'exécute qu'une seule fois. Comme cela devient un peu compliqué, je recommanderais que la vérification soit faite dans votre script lui-même, puis de lancer la commande cron chaque jour du mois concerné. Quelque chose comme

## Check if this is a weekday 
[ $(date '+%u') -le 5 ] && [ $(date '+%u') -ge 1 ] || exit;
## Make sure it only runs once. If yesterday was also a weekday and 
## date >=3 and <=5, we can assume the script ran then and should exit. 
[ $(date -d yesterday '+%u') -le 5 ] && [ $(date -d yesterday '+%u') -ge 1 ] && 
 [ $(date -d yesterday '+%d') -le 3 ] && [ $(date -d yesterday '+%d') -ge 5  ] && exit;
## Rest of your script goes here
[...]

Ensuite, de cron lancez votre script uniquement les jours 3 à 5 de chaque mois :

7 0 3-5 * *  /path/to/my/script.sh

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