it-swarm-eu.dev

Comment puis-je dire à cron d'exécuter une commande tous les deux jours (impair / pair)

Lors de la configuration de cron pour exécuter une commande tous les deux jours en utilisant le champ "Jour du mois", comme ceci:

1 22 */2 * * COMMAND

il s'exécute chaque fois que le jour du mois est impair: 1,3,5,7,9 et ainsi de suite.

Comment puis-je configurer cron pour qu'il s'exécute des jours du mois qui sont même comme 2,6,8,10 et ainsi de suite (sans le spécifier littéralement, ce qui est problématique car chaque mois a un nombre différent de jours dans le mois)?

46
freddie

La syntaxe que vous avez essayée est en fait ambiguë. Selon le nombre de jours dans le mois, certains mois, il fonctionnera les jours impairs et certains même. En effet, la façon dont il est calculé prend le nombre total de possibilités et les divise. Vous pouvez remplacer ce comportement strage-ish en spécifiant manuellement la plage de jours et en utilisant un nombre impair ou pair de jours. Étant donné que les scripts de jour pair ne s'exécuteraient jamais le 31e jour de mois plus longs, vous ne perdez rien en utilisant 30 jours comme base pour les jours pairs, et en spécifiant spécifiquement pour le diviser comme s'il y avait 31 jours, vous pouvez forcer impair -exécution journalière.

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 au sujet des mois n'ayant pas le même nombre de jours n'est pas importante ici car aucun mois n'a PLUS de jours que cela, et pour un mois de février médiocre, la plage de dates ne correspondra jamais au dernier jour ou deux, mais cela ne fera aucun mal l'avoir répertorié.

Le seul "piège" pour cette approche est que si vous êtes sur un cycle de jours impairs, les mois suivants avec 31 jours, votre commande s'exécutera également le premier du mois. De même, si vous forcez un cycle pair, chaque année bissextile entraînera un cycle de trois jours fin février. Vous ne pouvez pas vraiment contourner le fait que tout schéma régulier de "tous les deux jours" ne va pas toujours tomber les jours pairs ou impairs de chaque mois et de quelque manière que ce soit, vous aurez soit une course supplémentaire, soit il vous manquera une course entre mois avec des dénombrements de jours différents.

64
Caleb

Je pense qu'une possibilité utilise le jour de l'année, comme ceci:

# for odd days
test $(((`date +%j` % 2))) != 0 && command

# for even days
test $(((`date +%j` % 2))) == 0 && command

Il est testé pour les systèmes Unix et Linux.

2
Jordi

En général, je l'exécutais tous les jours et je demandais au script d'utiliser la logique pour déterminer s'il devait être exécuté aujourd'hui.

La création d'un fichier d'état simple indiquant la dernière exécution puis la comparaison fonctionnerait très facilement.

S'il doit être exécuté via différentes sources, rendez-le dépendant de l'argument.

1
Klas Mattsson

Vérifions chaque jour s'il s'agit d'un "autre" :-) (bc programme requis)

0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command

(Je ne suis pas sûr que le code s'affiche correctement. Le date +%s la partie est entre les apostrophes arrière.)

1
user37264