31 implique-t-il nécessairement la fin du mois dans un travail cron?

13

Pour le travail cron, nous savons que nous pouvons régler l'heure comme ci-dessous.

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

Ce que je veux savoir, c'est que lorsque nous fixons le jour du mois 31, cela signifie-t-il la fin de chaque mois, même si le mois n'a pas le jour 31. J'espère avoir une réponse.

Merci d'avance

squillman
la source

Réponses:

22

Non, 31 signifie 31.

Cependant, vous pouvez faire de la supercherie. Définissez le travail pour qu'il s'exécute n'importe quel jour qui pourrait potentiellement être le dernier jour du mois (c'est-à-dire 28-31 dans le champ du jour du mois), puis remplacez votre commande par une expression shell comprenant un test à la date protégeant le commander:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

L'expression à l'intérieur des crochets de test demande simplement si le numéro de mois d'aujourd'hui est différent du numéro de mois de demain, ce qui bien sûr ne sera vrai que le dernier jour du mois. Notez que la forme de cette expression dépend de votre local date- vous devrez peut-être la modifier si vous n'avez pas la version GNU actuelle.

Je dois dire que je n'ai pas inventé cela - je l'ai trouvé avec un rapide Google dans un message de liste de diffusion par Matthew Jarvis. J'imagine que c'est vraiment un truc de vieux assistant Unix standard.

Tom Anderson
la source
1
Cela ne peut pas être trop vieux, étant donné les options spécifiques à GNU pour "date" =)
jj33
4
Sur les sites stackexchange, poser une question à laquelle une réponse Google peut répondre, n'est PAS une mauvaise chose. En fait, c'est une bonne chose, car la prochaine personne qui effectuera une recherche dans Google trouvera la réponse sur stackexchange et viendra ici.
miernik
12

Non, je pense que le mieux que vous puissiez faire est de courir à minuit le 1er du mois, ou de configurer des lignes crontab individuelles pour chaque mois (ou au moins, une ligne pour les mois avec 28,29,30 et 31 jours)

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command
Paul Dixon
la source
Merci Paul! Je vais suivre le second. Pour la deuxième méthode, dois-je définir trois fois le même fichier? Merci encore :)
Oui, vous devrez le répéter.
Paul Dixon
7
Je n'ai aucune expérience avec cron, mais "0 0 28,29 2" ne s'exécuterait-il pas deux fois au cours d'une année bissextile? Non pas que ce serait un problème pour les deux prochaines années, mais quand même ...
Wim ten Brink
C'est un bon point, pas de solution simple
Paul Dixon
4

Je ne pense pas que vous puissiez le faire facilement dans le crontab.

Une option consisterait à définir l' cronexécution du script tous les jours, puis à vérifier que le script lui-même est le dernier jour du mois.

Dave Webb
la source
3

Je suppose que cron a un caractère spécial «L» destiné à cet effet:

*    *    L    *    *    your_script.sh 

exécuterait votre script le dernier jour de chaque mois

D'autre part,

*    *    0    *    *    your_script.sh

Vous pouvez même spécifier quelque chose comme:

*    *    *    *    1,5L    your_scrript.sh

pour exécuter le script les derniers lundi et vendredi de chaque mois

ou

*    *    *    *    1    your_script.sh

pour exécuter le script tous les lundis à minuit.

Saasira
la source
0

Cela fera le travail:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

exit 1
Phil
la source