Como fazer com que o crontab rode nos 6º, 7º e 8º dias úteis de um mês?

Como fazer com que o crontab rode nos 6º, 7º e 8º dias úteis de um mês?

Estou construindo uma expressão cron que deve ser executada a cada 30 minutos apenas em um intervalo de dias úteis, por exemplo: 6º, 7º e 8º dias úteis de um mês.

Atualmente tenho uma expressão cron, mas que só funciona nos dias 6, 7 e 8 do mês, independentemente de ser dia útil ou não.

Expressão cron atual:

0 0/30 * 6-8 * ?

Tentei usar a expressão do dia útil mais próximo

0 0/30 * 6W * ?

Mas isso não funciona por vários dias - como de6W-8W.

Qualquer ajuda nesse sentido é muito apreciada.

PS: Não pretendo fazer isso usando um script.

Responder1

Hm.. Não, você não pode. Não há como especificar um intervalo de dias úteis em uma única expressão cron. As expressões Cron limitam-se a especificar datas fixas ou intervalos para os campos de dia do mês e dia da semana.

Uma solução seria criar três cron jobs separados, um para cada dia útil em que você deseja executar o comando, assim:

# 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

Responder2

Você não pode (ou pelo menos não sou inteligente o suficiente para ver como).

Existem restrições no crontab que permitem escolherdia do mêsedia da semana.

Todos os dias úteis seriam os dias da semana 1 a 5, mas isso não é suficiente porque você precisa contar ou expressar

6º, 7º, 8º dia de (dias da semana: 1-5) deste mês

Então você precisa de um roteiro.

$ 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

Novembro de 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

informação relacionada