Мне нужна ваша помощь, чтобы создать задание 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 с воскресенья.
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 дня 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"
Нет! Но есть ли смысл выполнять его в любой день?