Назад | Перейти на главную страницу

выражение cron для выполнения во «второй последний рабочий день» месяца

Мне нужна ваша помощь, чтобы создать задание cron, которое будет запускаться во второй последний рабочий день каждого месяца. Я могу делать LW, как показано ниже, но я не уверен, как делать второй последний. Мне нужна ваша помощь и совет, пожалуйста.

@MWE любезно предоставил мне возможное решение, но, похоже, оно не работает во всех тестовых сценариях.

code:
#!/bin/bash
date
WEEKDAY=$(date +%u)
# If detect the montday in 2 days.
if [ $(date +%d -d "2 day") -eq 1 ] && [ ${WEEKDAY} -lt 5 ] ; then
   echo "This is the 2. last working day of the month"
# If detect the montday in 5 days.
elif [ $(date +%d -d "5 day") -eq 1 ] && [ ${WEEKDAY} -eq 5 ] ; then
   echo "This is the 2. last working day of the month"
else
  exit
fi

Сценарий тестирования: я изменил системную дату на сервере, чтобы она была 29 августа 2019 г. (** это вторая последняя рабочая дата в системе)

скрипт в режиме отладки выходит:

[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

ценю вашу помощь здесь ..

Так же простая идея решить это в скрипте, а не в crontab .:

Последний день месяца всегда является этим днем, когда завтра = 1. месяца.

Это означает: позвольте вывести текущую дату из эпохи в секундах и добавить 24 часа. Затем давайте выясним, какой сейчас день месяца:

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

Определите день месяца завтра:

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

если DAYOFMONTH == 1, то сегодня последний день месяца. Тогда делай, что хочешь. если не == 1, выйти.

Альтернативы можно найти здесь: 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"`

# See if tomorrow's day is less than today's
if [ $TOMORROW -lt $TODAY ]; then
echo "This is the last day of the month"
# Do stuff...
fi

или:

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

Последний, но тем не менее важный. Умножьте $ (($ TIMESTAMP + 86400 * 2)) для 2. последнего дня.

или:

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

или:

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

Выйти в 2. последний рабочий день месяца. % u начинаем с первого дня в понедельник. % w с воскресенья.

  1. Последний рабочий день - обычно четверг. Итак, 4. будний день. Мы должны смотреть сейчас на 6 дней в будущее. -> Значит, последние 2. Рабочий день месяца должен быть до 5-го числа месяца.
WEEKDAY=$(date +%u)
TOMORROW=$(date +%d -d "5 day")
if [ ${WEEKDAY} -eq 4 ] && [ $TOMORROW -lt 5 ]; then
echo "This is the 2. last working day of the month"
fi

В crontab вы можете ограничить выполнение рабочими днями и месяцами. Оба в сочетании - хорошее начало. Таким образом, вы можете убедиться, что сценарий запускается только в рабочий день. В месячный день известно февраль (28 дней и т. Д.) Или всего 30 дней. он не заканчивается 31 на каждый месяц! Так что, на всякий случай, можно использовать день 20-31.

     field          allowed values
          -----          --------------
          minute         0-59
          hour           0-23
          day of month   1-31
          month          1-12 (or names, see below)
          day of week    0-7 (0 or 7 is Sunday, or use names)

Cronentry нравится:

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

Деталь узнать просто, какая вторая, третья или четвертая. Будний день. Зачем? Скрипт запускается crontab только в рабочие дни. Так что нас не волнует суббота или воскресенье. В качестве альтернативы мы могли бы проверить, есть ли Weekday $ (date +% u) в 1-5. Это рабочие дни.

Код теперь простой:

Если через 2 дня это первый день месяца ... это второй последний рабочий день. Но как насчет субботы и воскресенья?

Тебе сейчас нужен чехол. С понедельника по четверг всегда будет рабочий день. Итак, по правилам, если через 2 дня 1. День месяца, это 2. Последний рабочий день. Только в пятницу должно быть первое месяца из 5 дней, чтобы быть вторым рабочим днем. Или первое число месяца должно быть вторником.

WEEKDAY=$(date +%e)
# 1. If detect the montday in 2 days.
if [ $(date +%d -d "2 day") -eq 1 ] && [ ${WEEKDAY} -lt 5 ] ; then
   echo "This is the 2. last working day of the month"
# 1. If detect the montday in 5 days.
elif [ $(date +%d -d "5 day") -eq 1 ] && [ ${WEEKDAY} -eq 5 ]
   echo "This is the 2. last working day of the month"
else 
  exit
fi

Надеюсь, я ничего не пропущу.

Мне все еще нужно установить задание cron как "0 0 20-31 * 1-5 ./scriptname"

Нет! Но есть ли смысл выполнять его в любой день?