Cron pour ne pas fonctionner un jour spécifique mais tous les autres jours

8

J'ai une configuration cron pour exécuter un script bash tous les jours à 22h. J'ai une autre configuration cron à exécuter mensuellement le 1er du mois. Les deux crons lancent un script bash, et la seule différence dans le script bash est l'argument qu'ils passent dans le programme java sous-jacent (émulant le lancement en ligne de commande du programme java).

Le problème est que je dois désactiver le cron quotidien en quelque sorte le 1er du mois afin que les deux n'essaient pas de s'exécuter le même jour. Est-ce possible de le faire automatiquement?

Je suppose que je peux créer un autre script bash pour éditer le cron avant le 1er puis à nouveau après pour remettre les choses en place, mais cela semble ... impur.

SnakeDoc
la source
tous les mois n'ont pas 31 jours, n'est-ce pas un problème?
SnakeDoc
Non
Stéphane Chazelas
une bonne alternative à la solution proposée par @suspectus
SnakeDoc
2
ou 2-31 pour le champ jour du mois.
ash
@ash - voyez ma réponse, c'est exactement ce que j'ai suggéré.
slm

Réponses:

10

Dans la même veine que la solution proposée par @StephaneChazelas dans les commentaires, vous pouvez spécifier la plage de jours dans le 3e champ comme plage pour le cron que vous souhaitez exécuter tous les jours en plus du 1er du mois.

Les deux entrées suivantes accompliraient ce que vous recherchez:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash
slm
la source
en fait, ne semble pas fonctionner pour moi (sauf si je fais quelque chose de mal) - le formatage dans les commentaires est terrible - alors voyez mon pastbin s'il vous plaît pour ce que
j'obtiens
oups, il doit être 0 22 2-31 * * dans votre exemple. je vais éditer.
SnakeDoc
1
@SnakeDoc - merci, toutes ces colonnes commencent à se fondre après un certain temps 8-)
slm
yup je les oublie aussi - je les installe, puis oublie comment je l'ai fait (bonne chose pour la page de manuel lol)
SnakeDoc
8

La façon la plus simple de gérer cela est d'avoir une seule entrée cron. Modifiez le script bash pour vérifier la date - si c'est le 1er du mois, appelez le programme java avec les paramètres mensuels, sinon appelez le programme avec les paramètres quotidiens.

Changer le script rend le processus plus simple car le script en tant que document décrit mieux ce qui se passe sans nécessiter d'informations supplémentaires dans une table cron.

Les mods de script pourraient ressembler à ceci:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi
suspect
la source
1
a fini par aller avec cette solution. J'ai créé un autre script bash avec votre exemple de code, et sous mensuel - il lancera le script bash mensuel (qui à son tour alimente l'argument mensuel du programme java sous-jacent), lance quotidiennement le script quotidien, etc.
SnakeDoc
0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Je pense qu'en utilisant la comparaison entière si plus correcte

la date '+% d' renvoie 01 et non 1, donc l'utilisation de la comparaison de chaînes == sera fausse

au lieu

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
Wodel
la source