Gostaria de executar um trabalho do cron às 8h30 na primeira segunda-feira de cada mês. A página cron da Wikipedia diz
Embora normalmente o trabalho é executado quando os / campos de especificação de data todos os tempos coincidir com a hora ea data atuais, há uma exceção: se ambos "dia do mês" e "dia da semana" são restritas (e não "*"), então quer o campo "dia do mês" (3) ou o campo "dia da semana" (5) deve corresponder ao dia atual.
(minha ênfase)
Isso significa que não posso fazer a primeira segunda-feira do mês, só posso fazer o primeiro (ou o que for) dia do mês? Não consigo pensar em uma maneira de contornar isso.
Respostas:
Você pode colocar a condição no comando crontab real:
Agora, se essa condição for verdadeira em um dos primeiros sete dias em um mês, você terá sua primeira segunda-feira. Observe que, no crontab, a porcentagem de sintaxe precisa ser escapada:
Substitua o
echo
comando pelo comando que você deseja executar. Também encontrei uma abordagem semelhante .fonte
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
como funciona[ $(date '+%a') = "Mon" ] && echo "It's Monday"
Mas, no crontab, parece estar falhando neste teste. Eu não posso começar a qualquer feedback útil a partir do cron: i estou tentando isso[ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1
para capturar qualquer saída de erro em um log, mas que não está funcionando ou: /date
saída está correta? Por exemplo, apenas permita que umcron
comando execute isso em um arquivo:date '+%a' > ~/datetest 2>&1
- verifique se isso resultou na string correta para comparação.+%a
precisava escapar quando ele estava no crontab, ou seja, a linha precisava ser este:[ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
. Se você poderia atualizar sua resposta com que ele seria útil para futuros leitores :) Obrigado novamente - MaxEu tenho um computador com localidade em espanhol, portanto, essa abordagem não está funcionando para mim porque mon muda para lun
Outros idiomas também falharam, então fiz uma pequena variação na resposta aceita que elimina a barreira do idioma:
fonte
Acho mais fácil quando não há necessidade de lidar com os números dos dias.
Execute a primeira segunda-feira do mês:
ou seja, se o mês 1 semana atrás não for igual ao mês atual, estaremos no 1º dia 1 (= segunda-feira) do mês.
Da mesma forma, para a terceira sexta-feira
ou seja, se o mês 3 semanas atrás for diferente do mês atual, estaremos no terceiro dia 6 (= sexta-feira) do mês
fonte
Programei um trabalho para ser executado na 4ª segunda-feira de cada mês às 16:00 da seguinte maneira:
fonte
Até onde eu sei, NÃO é possível usar apenas o crontab, no entanto, pode-se usar uma função de wrapper para selecionar o dia correto a partir de uma entrada de contab dos "primeiros sete dias do mês"; veja isso na entrada.
O script do wrapper seria
e você precisaria executá-lo (assumindo que seja chamado wrapper.sh e disponível globalmente) usando a entrada crontab
fonte
No Solaris 10, tive que formatar a condição da seguinte maneira:
fonte
Você pode tentar executar o cronjob nos primeiros sete dias do mês e deixá-lo executar apenas na segunda-feira.
Acima deve funcionar para você.
fonte
Eu recomendo usar
ao invés de
para evitar problemas de localidade.
fonte
Eu fiz uma solução geral para esse tipo de problema, funciona pela primeira, segunda, terceira ..... última semana do mês.
Você pode usá-lo assim:
O script run-if-today verifica o dia da semana e o período da semana desejado, se ambos corresponderem, retornará 0, caso contrário 1.
Verifique o código aqui. https://github.com/xr09/cron-last-sunday
fonte
Eu acredito que isso resolve o problema de maneira mais elegante:
fonte
Como interpreto minhas instruções cron usando php e js, não posso usar o bash. Finalmente, descobri que é de fato possível com apenas cron:
Espero que isso ajude outra pessoa. Independentemente disso, desejo a todos um lindo dia. :-)
fonte
Isso funcionará para todas as segundas-feiras de cada mês.
fonte