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