Выражение 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

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

2
задан 22 July 2019 в 15:49
4 ответа

Так же простая идея решить эту проблему в скрипте, а не в 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- месяц

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 ]
1
ответ дан 3 December 2019 в 12:29

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

  1. последний рабочий день обычно четверг. Итак, 4. будний день. Мы должны смотреть сейчас на 6 дней в будущее. -> Означает последние 2. Рабочий день месяца должен быть до 5-го числа месяца.
 WEEKDAY = $ (date +% u)
ЗАВТРА = $ (дата +% d -d "5 дней")
если [$ {WEEKDAY} -eq 4] && [$ TOMORROW -lt 5];  тогда
echo "Это 2-й последний рабочий день месяца"
фи
 
0
ответ дан 3 December 2019 в 12:29

В 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)

Crontabentry как:

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

Часть легко узнать, что такое второй, третий или 4. Будний день. Зачем? Скрипт запускается 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

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

0
ответ дан 3 December 2019 в 12:29

Мне все еще нужно установить задание cron как «0 0 20-31 * 1-5 ./scriptname"[121estiveNo! Но есть ли смысл выполнять его в любой день?

0
ответ дан 3 December 2019 в 12:29

Теги

Похожие вопросы