La syntaxe que vous avez essayée est en réalité ambiguë. En fonction du nombre de jours dans le mois, certains mois, les jours impairs et les jours pairs. En effet, la manière dont il est calculé prend le nombre total de possibilités et les divise. Vous pouvez contourner ce comportement aléatoire en spécifiant manuellement la plage de jours et en utilisant un nombre de jours impair ou pair. Comme les scripts de jour même ne fonctionneraient jamais le 31e jour de mois plus longs, vous ne perdez rien en utilisant 30 jours comme base, et en spécifiant spécifiquement de le diviser comme s'il y avait 31 jours, vous pouvez forcer des impairs. exécution d'un jour.
La syntaxe ressemblerait à ceci:
# Will only run on odd days:
0 0 1-31/2 * * command
# Will only run on even days:
0 0 2-30/2 * * command
Votre préoccupation concernant les mois n'ayant pas le même nombre de jours n'est pas importante ici car aucun mois n'a PLUS de jours que celui-ci et pour un mois de février médiocre, la plage de dates ne correspondra jamais au dernier jour ou aux deux derniers jours, mais elle ne fera aucun mal à il a énuméré.
Le seul 'acquis' pour cette approche est que si vous êtes sur un cycle de jours impairs, les mois suivants avec 31 jours, votre commande sera également exécutée le premier du mois. De même, si vous forcez un cycle pair, chaque année bissextile entraîne un cycle de trois jours et la fin du mois de février. Vous ne pouvez vraiment pas oublier le fait qu’un schéma régulier de "tous les jours" ne va pas toujours tomber les jours pairs ou impairs tous les mois et quelle que soit la façon dont vous le forcerez, vous ferez un essai supplémentaire ou manquerez un essai entre mois avec des jours mal appariés compte.
0,2,4...,30,32,34
et peu importait, les valeurs hors limites ne seraient jamais mises en correspondance.0 0 2-30/2 * * command
0 0 2-30/2 * * command
fonctionne comme prévu.Je pense qu'une possibilité utilise le jour de l'année, comme celui-ci:
Il est testé pour les systèmes Unix et Linux.
la source
test $(($(date +%j) % 2)) == 0 && command
test $(($(date +%s) / 86400 % 2)) == 0 && command
Vérifions chaque jour s'il s'agit d'un "autre" :-) (
bc
programme requis)(Je ne suis pas sûr que le code apparaisse correctement. La
date +%s
partie se situe entre les apostrophes arrière.)la source
En général, je l'utilisais tous les jours et le script utilisait la logique pour déterminer s'il devait être exécuté aujourd'hui.
Créer un simple fichier de statut indiquant la dernière exécution, puis la comparaison fonctionnerait très facilement.
Si vous devez utiliser différentes sources, faites-le dépendre des arguments.
la source