Comment planifier un cronjob toutes les deux semaines?

10

crontab (5) définit les champs suivants:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

et explique:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Donc, pas d'emplois bihebdomadaires, autant que je sache. Je suis sûr qu'il existe des solutions de contournement, quelles sont les vôtres? Ou ai-je raté quelque chose?

romain
la source
2
La meilleure réponse que je puisse trouver à ce sujet est ici: unix.stackexchange.com/questions/1224/…
Somantra
... et ces réponses sur U&L seraient la façon dont je le ferais, @Somantra :-)
voretaq7
@ voretaq7, j'aurais dit que c'était la réponse canonique, mais je ne voulais pas
apparaître

Réponses:

8

Vous pouvez faire exécuter la chose par cron tous les mercredis, puis la faire exécuter décider si c'est une semaine paire ou une semaine impaire. par exemple:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi
Ragoût
la source
Ceci est une bonne solution, cependant, ne répond pas vraiment à la question elle-même - je préférerais ne pas entacher la chose avec la logique du calendrier. Je peux peut-être intégrer cela avec le lien donné par @Somantra.
Roman
D'accord, je dois admettre: c'est la meilleure solution jusqu'à présent. Le lien que @Somantra a donné donne les mêmes résultats que IMHO inutilement complexes (en comptant avec le temps UNIX), mais l'ajout de votre approche directement au cronjob (au lieu de dans le script) dans le même style le rend assez élégant.
Roman
Cela casse en l'an 2020 car il a 53 semaines. Ex: Si votre cron devait s'exécuter toutes les deux semaines le 31 décembre, il s'exécuterait le 31 décembre 2020 (53e semaine) et le 4 janvier 2020 (1re semaine).
mad_fox
4

De nombreux crons (vous n'avez pas spécifié lequel vous utilisez) prennent en charge les plages. Donc quelque chose comme

0 0 1-7,15-21 * 3

Frapperait le premier et le troisième mercredi du mois.

quadruplebucky
la source
c'est un peu plus élégant que la méthode "faites-le dans le script", mais n'oubliez pas d'ajouter un commentaire à votre crontab (règle générale: si vous en avez plusieurs -ou /impliqué, cela vaut probablement la peine de commenter pour décrire le calendrier)
voretaq7
Je soupçonne que c'est faux; cela entraînera l'exécution du travail les 1er-7 et 15-21 de chaque mois, ainsi que tous les mercredis. Ceci à partir de man 5 crontab: " Le jour de l'exécution d'une commande peut être spécifié par deux champs - jour du mois et jour de la semaine. Si les deux champs sont restreints (c.-à-d. Ne sont pas *), la commande sera exécutée lorsque l' un des champs correspond à la Par exemple, «30 4 1,15 * 5» entraînerait l'exécution d'une commande à 4 h 30 le 1er et le 15 de chaque mois, plus chaque vendredi »(c'est moi qui souligne).
MadHatter
1
En fait, cela dépend du démon cron que vous utilisez. Votre entrée semble provenir de Vixie Cron (inclus dans les distributions RedHat). De "man crontab" sur le cron de dillo (Slackware): Si vous spécifiez à la fois un jour du mois et un jour de la semaine, * il sera interprété comme le Nième jour du mois *. Pourtant, une solution scriptée (calcul du numéro de semaine) ressemble à la seule solution portable.
AlvaroGMJ
2

Pour quelque chose qui doit être exécuté toutes les deux semaines, utilisez ce one-liner:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Ce script particulier est prévu pour s'exécuter le vendredi. La semaine à exécuter peut être ajustée en utilisant "-eq 0" ou "-eq 1"

AlexY
la source
1

Anacron est une bonne solution de contournement pour les limitations de cron.

  • Anacron possède un paramètre Période de récurrence que vous pouvez définir sur 14.

commande d'identificateur de tâche de délai

14 15 test.daily /path/to/script.sh

Somantra
la source
Malheureusement, l'anacron ne peut pas être utilisé. J'ai oublié de le mentionner.
Roman
1

Si vos besoins ne sont pas littéralement bihebdomadaires, vous pouvez simplement exécuter le cronjob le 1er et le 15 du mois:

15 8 1,15 * * /your/script.sh

Qui fonctionne à 8h15 le premier et le quinzième de chaque mois quel que soit le jour de la semaine.

Chris Brewer
la source
-2

À partir de cette explication, le paramètre 3/2 sur le champ de la semaine devrait exécuter la tâche tous les deux mercredis - c'est implicite, mais je pense que c'est faisable.

Journeyman Geek
la source
non, c'est équivalent for(int i=3; i <=3 ; i+=2) {} car il ne passe par cette fois qu'une seule fois, peu importe si le "step" est 1 ou 2.
ragoût
Ce que @stew a dit. De plus, il n'y a pas de "champ semaine".
Roman
Par champ de semaine, je veux dire le "champ Jour de la semaine"
Journeyman Geek