2 votes

Expression cron pour s'exécuter le "deuxième dernier jour ouvrable" du mois

J'ai besoin de votre aide pour construire une tâche cron qui s'exécute le deuxième dernier jour ouvrable de chaque mois. Je peux faire LW comme indiqué ci-dessous mais je ne suis pas sûr de comment faire l'avant-dernier. J'ai besoin de votre aide et de vos conseils ici s'il vous plaît.

@MWE m'a gentiment fourni une solution possible mais cela ne semble pas fonctionner dans tous les scénarios de test.

code:
#!/bin/bash
date
WEEKDAY=$(date +%u)
# Si le lundi est détecté dans 2 jours.
if [ $(date +%d -d "2 day") -eq 1 ] && [ ${WEEKDAY} -lt 5 ] ; then
   echo "C'est le 2ème dernier jour ouvrable du mois"
# Si le lundi est détecté dans 5 jours.
elif [ $(date +%d -d "5 day") -eq 1 ] && [ ${WEEKDAY} -eq 5 ] ; then
   echo "C'est le 2ème dernier jour ouvrable du mois"
else
  exit
fi

Scénario de test: J'ai modifié la date du système sur le serveur pour être le 29 août 2019 (**c'est le deuxième dernier jour ouvrable sur le système)

Le script en mode debug se ferme:

[oracle@rdbauroral01v ~]$ bash -x ./crontest.sh
+ date
Thu Aug 29 13:28:20 UTC 2019
++ date +%u
+ WEEKDAY=4
++ date +%d -d '2 day'
+ '[' 31 -eq 1 ']'
++ date +%d -d '5 day'
+ '[' 03 -eq 1 ']'
+ exit

Je vous remercie pour votre aide ici..

1 votes

Votre meilleur choix avec ce type d'expression de cron inhabituelle est de l'exécuter quotidiennement et de laisser le script lui-même gérer la logique plus compliquée.

1voto

Just as simple idea to solve it in the script not in crontab.:

Dernier jour d'un mois est toujours celui-ci, quand demain = 1. du mois.

Cela signifie : Sortir la date actuelle de l'époque en secondes, et ajouter 24h. Puis déterminer de quel jour du mois il s'agit :

TIMESTAMP=$(date +%s)
TIMESTAMP_TOMORROW=$(( $TIMESTAMP + 86400 ))

Trouver le jour du mois de demain:

DAYOFMONTH=$(date --date="@${TIMESTAMP_TOMORROW}" +%e)

si DAYOFMONTH == 1 aujourd'hui est le dernier jour du mois. Faites ce que vous voulez, alors. si non == 1, sortir.

Des alternatives peuvent être trouvées ici: https://stackoverflow.com/questions/6139189/cron-job-to-run-on-the-last-day-of-the-month

TODAY=`date +%d`
TOMORROW=`date +%d -d "1 day"`

# Voir si le jour de demain est inférieur au jour d'aujourd'hui
if [ $TOMORROW -lt $TODAY ]; then
echo "C'est le dernier jour du mois"
# Faire quelque chose...
fi

ou :

0 23 28-31 * * [ `/bin/date -d +1day +\%d` -eq 1 ] && myscript.sh

Enfin, Multipliez $(( $TIMESTAMP + 86400 * 2 )), pour l'avant-dernier jour.

ou :

TOMORROW=$(date +%d -d "2 day")

ou :

[ $(/bin/date -d +2day +\%d) -eq 1 ]

0 votes

Désolé pour mon ignorance mais ce qui précède me donnerait "le deuxième jour avant la fin du mois" mais ce que je cherche est "le deuxième jour avant le dernier jour ouvrable du mois"

0 votes

Eh bien, avant-dernier jour de la semaine .... c'est le 5ème jour de la semaine, n'est-ce pas? Alors essayez de comprendre la façon dont je procède. Dans votre cas, déterminez quel jour de la semaine il est. Ensuite, vérifiez que demain se situe entre le 1er et le 6ème jour du mois. Cela dépend de votre réglage, si la semaine commence le dimanche ou le lundi.

0 votes

Bonjour, veuillez excuser mon ignorance, car je suis très novice en Unix. Comment puis-je tester la prochaine exécution des dates mentionnées ci-dessus pour m'assurer qu'elles fonctionneront exactement comme vous l'avez décrit ? Je suis particulièrement intéressé à tester cette logique telle que vous l'avez décrite --- 0 23 28-31 * * [ /bin/date -d +1day +\%d -eq 1 ] && myscript.sh

0voto

Pour obtenir le 2ème dernier jour ouvrable du mois. %u commence avec le jour 1 comme lundi. %w avec dimanche.

  1. Le dernier jour ouvrable est généralement le jeudi. Donc le 4ème jour de la semaine. Nous devons maintenant regarder 6 jours dans le futur. -> Cela signifie que le 2ème dernier jour ouvrable du mois doit être avant le 5ème jour du mois.
WEEKDAY=$(date +%u)
TOMORROW=$(date +%d -d "5 day")
if [ ${WEEKDAY} -eq 4 ] && [ $TOMORROW -lt 5 ]; then
echo "C'est le 2ème dernier jour ouvrable du mois"
fi

0voto

En crontab, vous pouvez limiter l'exécution aux jours de semaine et au jours de mois. Les deux en combinaison sont un bon début. Ainsi, vous pouvez vous assurer que le script ne s'exécute que les jours ouvrables. Soyez conscient qu'en février (28 jours etc.) ou simplement 30 jours. cela ne se termine pas à 31 pour chaque mois! Alors peut-être utilisez les jours 20 à 31, pour être en sécurité.

     champ          valeurs autorisées
          -----          --------------
          minute         0-59
          heure           0-23
          jour du mois   1-31
          mois          1-12 (ou noms, voir ci-dessous)
          jour de la semaine    0-7 (0 ou 7 est dimanche, ou utilisez les noms)

Une entrée de crontab comme:

0 0 20-31 * 1-5 ./scriptname

La partie est simple à découvrir, quel est le 2e, 3e ou 4e jour de la semaine. Pourquoi? Le script s'exécute via crontab uniquement les jours ouvrables. Donc nous n'avons pas à nous soucier du samedi ou du dimanche. Sinon, nous pourrions vérifier si le jour de la semaine $(date +%u) est compris entre 1 et 5. Ce sont les jours ouvrables.

Le code est maintenant simple:

Si dans 2 jours, c'est le premier jour du mois... c'est l'avant-dernier jour ouvrable. Mais, que se passe-t-il le samedi et le dimanche?

Vous avez maintenant besoin d'un cas. Du lundi au jeudi sera toujours suivi d'un jour ouvrable. Donc, les règles, si dans 2 jours c'est le 1er jour du mois, c'est le 2e jour ouvrable. Seulement le vendredi, il doit y avoir le premier du mois dans 5 jours pour être le deuxième jour ouvrable. Ou le premier du mois doit être un mardi.

  JOUR_DE_LA_SEMAINE=$(date +%e)
# 1. Si détecte le lundi dans 2 jours.
if [ $(date +%d -d "2 day") -eq 1 ] && [ ${JOUR_DE_LA_SEMAINE} -lt 5 ] ; then
   echo "C'est le 2e dernier jour ouvrable du mois"
# 1. Si détecte le lundi dans 5 jours.
elif [ $(date +%d -d "5 day") -eq 1 ] && [ ${JOUR_DE_LA_SEMAINE} -eq 5 ]
   echo "C'est le 2e dernier jour ouvrable du mois"
else 
  exit
fi

J'espère ne rien avoir oublié.

0 votes

Merci. Quelqu'un a suggéré de créer une tâche cron du 26 au 31 pour vérifier si si (demain == dernier jour ouvrable), mais je ne suis pas sûr de la façon dont cela va fonctionner?

0 votes

Ne fonctionnera pas. 2. Le dernier jour ouvrable n'est pas le dernier jour ouvrable du mois. Voir l'exemple de janvier. Peut-être que le 30.01 est lundi. Le dernier jour ouvrable est vendredi donc demain ne sera pas le dernier jour ouvrable mais le lundi 30.01 est l'avant-dernier jour ouvrable du mois.

0 votes

Fait et réédité.

0voto

MWE Points 9

Est-ce que j'ai toujours besoin de définir la tâche cron en tant que "0 0 20-31 * 1-5 ./scriptname"

Non! Mais est-ce que ça a du sens de l'exécuter n'importe quel jour?

1 votes

Bienvenue sur Server Fault ! Cela ne répond pas à la question. Si vous avez une autre question, veuillez la poser en cliquant sur le bouton Poser une question.

0 votes

Gerarld Schneider, il répond à sa question dans un commentaire. Mais je ne suis pas en mesure de répondre directement à son commentaire. Je suis vraiment désolé à ce sujet...

2 votes

Malheureusement, les sites StackExchange ne fonctionnent pas tout à fait de cette façon - comme votre réponse n'est pas une réponse à la question réelle, il est difficile de la relier au commentaire auquel vous pensez. Le seul conseil que je puisse donner est de passer un peu de temps ici pour répondre aux questions, et vous obtiendrez bientôt suffisamment de points de réputation pour pouvoir commenter correctement.

0voto

BALA S Points 21

Essayez l'article suivant pour mieux comprendre les types d'expressions autorisées dans cron,

Plus précisément, Sur le "Jour du mois" si vous spécifiez comme, "28W" --> Soit il s'exécute le 28 ou si le 28 est un samedi/dimanche, il s'exécute le jour ouvrable le plus proche (le 27 si le 28 est un samedi ou le 29 si le 28 est un dimanche)

Réf : http://www.brightxpress.com/user/appendix/cron_expressions.htm

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X