![Executar um cron job na primeira segunda-feira de cada mês?](https://rvso.com/image/1316111/Executar%20um%20cron%20job%20na%20primeira%20segunda-feira%20de%20cada%20m%C3%AAs%3F.png)
Gostaria de executar um trabalho no cron às 8h30 da primeira segunda-feira de cada mês. A página cron da Wikipedia diz
Embora normalmente o trabalho seja executado quando todos os campos de especificação de hora/data correspondem à hora e data atuais, há uma exceção: se "dia do mês" e "dia da semana" forem restritos (não "*"), entãoqualquero campo “dia do mês” (3) ou o campo “dia da semana” (5) devem corresponder ao dia atual.
(minha ênfase)
Isso significa que não posso fazer na primeira segunda-feira do mês, só posso fazer no primeiro (ou qualquer outro) dia do mês? Não consigo pensar em uma maneira de contornar isso.
Responder1
Você pode colocar a condição no comando crontab real (forma genérica):
[ "$(date '+%u')" = "1" ] && echo "It's Monday"
se sua localidade for EN/US, você também pode comparar strings (resposta inicial):
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
Agora, se essa condição for verdadeira em um dos primeiros sete dias do mês, você terá a primeira segunda-feira. Observe que no crontab, a sintaxe percentual precisa ser escapada (maneira genérica):
0 12 1-7 * * [ "$(date '+\%u')" = "1" ] && echo "It's Monday"
se sua localidade for EN/US, você também pode comparar strings (resposta inicial):
0 12 1-7 * * [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
Substitua o echo
comando pelo comando real que você deseja executar. Achei umabordagem semelhantetambém.
Responder2
Eu tenho um computador com localidade em espanhol, então essa abordagem não está funcionando para mim porquesegmuda paraalmoço
Outros idiomas também falhariam, então fiz uma pequena variação na resposta aceita que elimina a barreira do idioma:
0 9 1-7 * * [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"
Responder3
Acho mais fácil quando não há necessidade de lidar com números de dias.
Execute na primeira segunda-feira do mês:
0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command
ou seja, se o mês de 1 semana atrás não for igual ao mês atual, então estamos no primeiro dia 1 (= segunda-feira) do mês.
Da mesma forma, para a terceira sexta-feira
0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command
ou seja, se o mês de 3 semanas atrás for diferente do mês atual, então estamos no 3º dia 6 (= sexta-feira) do mês
Responder4
Agendei um trabalho para ser executado na 4ª segunda-feira de cada mês às 16h da seguinte forma:
0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt