2 votes

Expression cron à 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écutera le deuxième dernier jour ouvrable de chaque mois. Je peux utiliser LW comme indiqué ci-dessous mais je ne suis pas sûr de comment faire pour obtenir l'avant-dernier. J'ai besoin de votre aide et de vos conseils s'il vous plaît.

@MWE m'a gentiment fourni une solution possible mais elle 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 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 de débogage se termine :

[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 meilleure option avec ce genre d'expression cron inhabituelle est de laisser la tâche s'exécuter quotidiennement et de laisser le script lui-même gérer la logique plus compliquée.

1voto

Tout simplement une idée simple pour le résoudre dans le script et non dans crontab.

Le dernier jour d'un mois est toujours ce jour, lorsque demain = 1. d'un mois.

Cela signifie: Sortons la date actuelle de l'époque en secondes et ajoutons 24 heures. Ensuite, déterminons de quel jour du mois il s'agit:

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

Déterminez 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, puis. sinon == 1, quittez.

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"`

# Vérifiez si le jour de demain est inférieur à celui d'aujourd'hui
if [ $TOMORROW -lt $TODAY ]; then
echo "C'est le dernier jour du mois"
# Faire des trucs...
fi

ou:

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

Enfin, multipliez $(( $TIMESTAMP + 86400 * 2 )), pour le 2ème 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 donnerait "le deuxième jour avant le dernier jour du mois" mais ce que je cherche est "le deuxième jour avant le dernier jour de la semaine du mois"

0 votes

Eh bien, l'avant-dernier jour de la semaine .... est le 5ème jour d'une semaine, n'est-ce pas? Essayez donc de comprendre le chemin que j'emprunte. Dans votre cas, découvrez quel jour de la semaine il est. Ensuite, vérifiez que demain est compris entre le 1er et le 6ème jour du mois. Cela dépend de vos paramètres, si la semaine commence par dimanche ou lundi.

0 votes

Salut, excuses d'avance, En tant que débutant en Unix, comment puis-je tester l'exécution suivante des dates ci-dessus pour savoir si cela fonctionnerait exactement comme vous l'avez décrit ? Surtout, je tiens à tester cette logique telle que vous l'avez indiquée --- 0 23 28-31 * * [ /bin/date -d +1day +\%d -eq 1 ] && myscript.sh

0voto

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

  1. Le dernier jour ouvrable est généralement le jeudi. Donc le 4ème jour de la semaine. Nous devons regarder maintenant 6 jours à l'avance. -> Cela signifie que les 2 derniers jours ouvrables du mois doivent ê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

Dans crontab, vous pouvez limiter l'exécution aux jours de la semaine et aux jours du mois. Les deux combinés sont un bon début. Ainsi, vous pouvez vous assurer que le script ne s'exécute que les jours ouvrables. Soyez conscient que février (28 jours etc.) ou juste 30 jours. cela ne se termine pas à 31 pour chaque mois ! Utilisez donc peut-être les jours 20 à 31, pour être sûr.

     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 utilisation des noms)

Entrée Crontab comme :

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

Il est facile de savoir quelle est le deuxième 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. Autre manière, 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 le deuxième dernier jour ouvrable. Mais, que faire du samedi et du dimanche ?

Vous avez maintenant besoin d'une condition. Du lundi au jeudi, un jour ouvrable suivra toujours. Donc, si dans 2 jours c'est le 1. jour du mois, c'est le 2. dernier jour ouvrable. Seulement le vendredi, le premier du mois doit être dans 5 jours pour être le deuxième jour ouvrable. Ou le premier d'un mois doit être un mardi.

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

J'espère que je n'ai rien oublié.

0 votes

Merci. Quelqu'un a suggéré de créer un cron 26-31 pour vérifier si si (demain == dernier jour de semaine), mais je ne suis pas sûr de comment cela va fonctionner?

0 votes

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

0 votes

Terminé et réédité.

0voto

MWE Points 9

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

Non! Mais est-ce logique 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 capable de répondre à son commentaire directement. Je suis vraiment désolé à ce sujet...

2 votes

Malheureusement, les sites StackExchange ne fonctionnent pas tout à fait de cette façon - puisque 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 peux 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

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

Plus précisément, le "Jour du mois" si vous spécifiez, "28W" --> soit il s'exécute le 28 ou si le 28 est samedi/dimanche, il s'exécutera le jour ouvrable le plus proche (le 27 si le 28 est samedi ou le 29 si le 28 est 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