Я создаю cron-выражение, которое должно запускаться каждые 30 минут только в определенный диапазон рабочих дней, например: 6-й, 7-й и 8-й рабочие дни месяца.
В настоящее время у меня есть cron-выражение, но оно запускается только 6-го, 7-го и 8-го числа месяца, независимо от того, рабочий это день или нет.
Текущее выражение cron:
0 0/30 * 6-8 * ?
Я пробовал использовать выражение ближайшего рабочего дня
0 0/30 * 6W * ?
Но это не работает в течение ряда дней - например, с6W-8W.
Любая помощь в этом отношении будет высоко оценена.
P.S. Не собираюсь делать это с помощью скрипта.
решение1
Хм... Нет, не можете. Невозможно указать диапазон рабочих дней в одном выражении cron. Выражения cron ограничены указанием фиксированных дат или интервалов для полей дня месяца и дня недели.
Одним из решений может стать создание трех отдельных заданий cron, по одному на каждый рабочий день, в который вы хотите запустить команду, например:
# for the 6th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 5 business day") = "Mon" ] && /path/to/your/command
# for the 7th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 6 business day") = "Tue" ] && /path/to/your/command
# for the 8th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 7 business day") = "Wed" ] && /path/to/your/command
решение2
Это невозможно (или, по крайней мере, я недостаточно умен, чтобы понять, как это сделать).
В crontab есть ограничения, которые позволяют вам выбиратьдень месяцаидень недели.
Все рабочие дни будут днями недели 1-5, но этого недостаточно, поскольку вам нужно посчитать или выразить
6-й, 7-й, 8-й день (дни недели:1-5) в этом месяце
Итак, вам нужен сценарий.
$ cat /home/jaroslav/tmp/workday-567.sh
#!/bin/bash
jan01() { date +%s -d `date +%Y-01-01`; }
december() { echo $(($(jan01) + 365*24*3600)); }
day=`jan01`; december=`december`;
today=${1:-$(date '+%Y-%m-%d')}
this_months_678th=$(
while [ $day -lt $december ];do
date '+%Y-%m-%d %B %A %u' -d@$day;
let day=$day+86400;
done |
sort -u |
sed -e "/[67]$/d; /$(date '+%Y-%m')/!d" |
sed -n -e '6p; 7p; 8p'
)
if echo -e "$this_months_678th" | grep -q $today; then
exit 0
fi
exit 1
Ноябрь 2018 г.;
$ for i in 2018-11-{01..31};
do bash /home/jaroslav/tmp/workday-567.sh $i && echo run on $i;
done
run on 2018-11-08
run on 2018-11-09
run on 2018-11-12