Pesquisei bastante sobre como fazer isso e vejo que não há maneira direta no cron de executar um trabalho, digamos, a cada duas quintas-feiras.
No momento, estou inclinado a fazer um script que apenas será executado a cada semana e tocará em um arquivo de "sinalização" quando for executado e, se for executado e o arquivo já estiver lá, para remover o arquivo (e não realizar a ação quinzenal).
Minha pergunta é: existe alguma outra maneira mais elegante ou mais simples de atingir esse objetivo de um script bash de ações sendo executado automaticamente a cada duas semanas?
Obrigado!
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script
Usei o bash para fazer minhas contas porque sou preguiçoso; mude isso para o que quiser. Aproveito o fato de 1º de janeiro de 1970 ser uma quinta-feira; para outros dias da semana, você terá que aplicar uma compensação. O Cron precisa que os sinais de porcentagem sejam escapados.
Checagem rápida:
function check {
when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
echo -n "$when: "
(($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}
for start in "2010-12-02" "2011-12-01"; do
for x in $(seq 0 12); do
check "$start + $(($x * 7)) days"
done
echo
done
Observe que escolhi horários aleatórios para mostrar que isso funcionará se for executado a qualquer hora na quinta-feira, e escolhi datas que ultrapassam os limites do ano e incluem meses com 4 e 5 quintas-feiras.
Resultado:
Thu Dec 2 06:19:00 UTC 2010: run
Thu Dec 9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan 6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb 3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run
Thu Dec 1 21:40:00 UTC 2011: run
Thu Dec 8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan 5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb 2 17:37:00 UTC 2012: skip
Thu Feb 9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run
Uma maneira pode ser usar o utilitário at
se você estiver executando o Linux. Você pode colocar isso no final do seu script:
at X + 2 weeks -f myscript
onde X é o horário em que você deseja executar o script. Para inicializar, basta chamar at
para o momento em que deseja executá-lo pela primeira vez e, em seguida, a instrução acima continua renovando sua chamada agendada.
Se você puder usar anacron
no sistema, as coisas serão muito mais simples. Para usar anacron
você deve tê-lo instalado e também deve ter acesso root. Não funciona em sistemas mais antigos (ou seja, RHEL 5.x), as versões mais antigas do ancron SÓ são executadas na inicialização. Ele funciona com sistemas mais novos (ou seja, RHEL 6.x).
Com anacron
, pode-se agendar trabalhos de uma forma mais flexível, por ex. execute o X job uma vez por semana. Além disso, anacron
executa tarefas quando o computador fica disponível, ou seja, você não precisa considerar quando o sistema está ativo ou inativo.
Para executar um script a cada duas semanas, você deve adicionar uma linha semelhante à seguinte para/etc/anacrontab:
14 5 myScript script.sh
Dê uma olhada na página do manual para detalhes.
Eu o executaria toda semana e faria o script verificar se o número da semana é ímpar: se sim, saia.
Isso precisaria de um pouco mais de reflexão para funcionar de dezembro a janeiro.
Talvez o script defina um arquivo de sinalizador de "última execução bem-sucedida". Quando o script for iniciado, verifique se o arquivo de sinalização foi modificado pela última vez há 14 dias.
Não tenho certeza se existe uma maneira mais elegante de definir o a cada duas semanas, mas isso pode funcionar para você.
00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script
Isso iniciará o script às 6h da primeira e terceira quintas-feiras do mês.