Как запустить crontab на 6-й, 7-й и 8-й рабочие дни месяца?

Как запустить crontab на 6-й, 7-й и 8-й рабочие дни месяца?

Я создаю 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

Связанный контент