88 votes

Comment demander à cron d'exécuter un travail toutes les deux semaines?

Je voudrais exécuter un travail avec cron qui sera exécuté un mardi sur deux à une heure donnée. Pour chaque mardi, c'est facile:

 0 6 * * Tue
 

Mais comment le faire "tous les deux mardis" (ou si vous préférez - toutes les deux semaines)? Je ne voudrais pas implémenter de logique dans le script lui-même, mais garder la définition uniquement dans cron.

56voto

pilcrow Points 20628

Réponse

Modifier votre mardi cron logique d'exécuter tous les autres semaine depuis l'époque.

Sachant qu'il y a 604800 secondes en une semaine (en ignorant les modifications d'heure d'été et des secondes intercalaires, merci), et de l'utilisation de GNU date:

0 6 * * Tue expr `date +\%s` / 604800 \% 2 >/dev/null || /scripts/fortnightly.sh

Côté

Calendrier de l'arithmétique est frustrant.

@xahtep la réponse est formidable, mais, comme @Doppelganger ont noté dans les commentaires, il va échouer sur certaines année frontières. Aucun des date utilitaire de la "semaine de l'année" spécificateurs peut vous aider ici. Certains mardi au début de janvier, il sera inévitablement répétez la semaine de la parité de la finale de mardi à l'année précédente: 2016-01-05 (%V), 2018-01-02 (%U), et 2019-01-01 (%W).

53voto

xahtep Points 996

Que diriez-vous de cela, il le garde dans les crontab même s'il n'est pas défini exactement dans les cinq premiers champs:

 0 6 * * Tue expr `date +\%W` \% 2 > /dev/null || /scripts/fortnightly.sh
 

10voto

Marcel Points 1378

Peut-être un peu bête, mais on pourrait aussi créer deux tâches cron, une pour chaque premier mardi et une pour chaque troisième.

Premier cronjob:

 0 0 8 ? 1/1 TUE#1 *
 

Deuxième cronjob:

 0 0 8 ? 1/1 TUE#3 *
 

Pas sûr de la syntaxe ici, j'ai utilisé http://www.cronmaker.com/ pour les créer.

-2voto

macetw Points 90

Qu'en est-il toutes les 3 semaines?

Voici ma suggestion:

 0 6 * * Tue expr `date +\%W` \% 3 == 0 > /dev/null || /scripts/fortnightly.sh
 

... ou ...

 0 6 * * Tue expr `date +\%W` \% 3 == 1 > /dev/null || /scripts/fortnightly.sh
 

... ou bien sur ...

 0 6 * * Tue expr `date +\%W` \% 3 == 2 > /dev/null || /scripts/fortnightly.sh
 

... en fonction de la rotation de la semaine.

-4voto

jimmyb Points 19

Cron fournit une syntaxe "tous les autres" "/ 2". Suivez simplement le champ de l'unité de temps approprié avec "/ 2" et il exécutera la tâche cron "toutes les fois". Dans ton cas...

 0 6 * * Tue/2
 

Ce qui précède devrait être exécuté un mardi sur deux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X