Comment instruire cron pour exécuter un job à chaque seconde semaine?
Je voudrais exécuter un travail par cron qui sera exécutée à chaque deuxième mardi à l'heure donnée de la journée. Pour chaque mardi est facile:
0 6 * * Tue
Mais comment le faire sur "chaque deuxième mardi" (ou si vous préférez -, toutes les deux semaines)?
Je ne voudrais pas mettre en œuvre toute logique dans le script lui-même, mais de garder la définition que dans cron.
- voir aussi unix.stackexchange.com/questions/197324/...
- Comment sur l'exécution de chaque semaine et de vérifier dans votre script (par exemple, en utilisant un fichier séparé) si c'est la deuxième semaine ou le premier?
if [ "$(cat week.txt)" == "1" ]; then echo -n "0">week.txt; dostuff; fi
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet, il ne conserver dans le
crontab
même si ce n'est pas exactement défini dans les cinq premiers champs: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:
De côté
Calendrier de l'arithmétique est frustrant.
@xahtep la réponse est formidable, mais, comme @Doppelganger ont noté dans les commentaires, elle échoue sur certains limites. Aucun des
date
utilité 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).expr \( `date +%s` - 21600 \) / 86400 % 2
et, pour les essaisexpr \( `date +%s -d "Thursday"` - 21600 \) / 86400 % 2
pilcrow réponse est grande. Cependant, il en résulte que l'fortnightly.sh script qui s'exécute tous les même semaine (depuis l'époque). Si vous avez besoin d'exécuter le script sur bizarre semaines, vous pouvez modifier sa réponse un peu:
La modification de la 1 à 0 remettez-même en quelques semaines.
Peut-être un peu bête, mais on pourrait aussi créer deux cronjobs, un pour chaque premier mardi et un pour chaque troisième.
Première tâche cron:
Deuxième tâche cron:
Pas sûr de la syntaxe ici, j'ai utilisé http://www.cronmaker.com/ de rendre ces.
J'ai découvert certaines des limitations des approches ci-dessus qui peut échouer dans certains cas limites. Par exemple, pensez à:
C'est parce que ces approches s'appuient sur l'heure UTC (date +%s). Prenons le cas où nous sommes à l'exécution d'un travail à 1h du matin et 10h tous les 2ème mardi.
Supposons GMT-2:
Si nous ne sommes qu'vérification d'un seul de temps chaque jour, ce ne sera pas un problème, mais si nous consultons plusieurs fois, ou si nous sommes près à l'heure UTC et l'heure d'été se produit, le script ne considère pas que ce soit la même journée.
Pour contourner ce problème, nous avons besoin de calculer un décalage UTC basé sur notre local pas fuseau horaire UTC. Je ne pouvais pas trouver un moyen simple de le faire en BASH, j'ai donc développé une solution qui utilise un rapide d'une doublure en Perl pour calculer le décalage entre l'heure UTC en quelques secondes.
Ce script prend avantage de la date +%z, qui sort le fuseau horaire local.
Script Bash:
ensuite, pour déterminer si la journée est pair ou impair:
Si vous voulez le faire sur la base d'un donné de date de début:
Devraient feu tous les autres lundi début avec 2018-03-19
Expression se lit comme suit: Exécuter à 6h du matin le lundi si ...
1 - Obtenir la date d'aujourd'hui, en quelques secondes, divisé par le nombre de secondes dans une journée pour convertir jours sice époque
2 - Faire la même chose pour la date de départ, la convertissant le nombre de jours depuis l'époque
3 - Obtenez la différence entre les deux
4 - diviser par 14 et vérifier le reste
5 - Si le reste est nul, vous êtes sur le cycle de deux semaines
Qu'en est-il de la 3e semaine?
Voici ma suggestion:
... ou ...
... ou bien ...
... en fonction de la semaine de la rotation.
Si vous voulez tous les mardi de la deuxième semaine seulement:
00 06 * * 2#2
#
comme délimiteur de commentaire.Syntaxe "/2" n'est pas va de pair avec jour de la semaine. Donc, mon ajoutée à la puce ci-dessus est tout simplement l'utilisation 1,15 sur MonthDay déposée.
0 6 1,15 * * /scripts/fornightly.sh > /dev/null 2>,&1
Pourquoi pas quelque chose comme
Est appropriée?
crontab(5)
. Votre format sera exécuté tous les jours pendant la première semaine, chaque jour de la troisième semaine, et chaque jour de la semaine dernière, en plus de toute la journée qui se trouve être un vendredi. C'est beaucoup de pistes.Cron fournit une "tous les autres" syntaxe "/2". Il suffit de suivre l'unité de temps qui convient le terrain avec le "/2" et il exécutera la tâche cron 'tous les autres temps". Dans votre cas...
Ci-dessus, à exécuter toutes les autres du mardi.