Execute um script via cron a cada duas semanas

11

Eu fiz um pouco de pesquisa sobre como fazer isso, e vejo que não há nenhuma maneira direta no cron de executar um trabalho, digamos, todas as outras quintas-feiras.

Neste momento, estou inclinado a criar um script que seja executado em todas as semanas e toque em um arquivo "sinalizador" quando for executado, e se ele for executado e o arquivo já estiver lá , para remover o arquivo (e não executar a ação quinzenal).

Minha pergunta é, existe alguma outra maneira mais elegante ou mais simples de realizar esse objetivo de um script bash de ações executadas a cada duas semanas automaticamente?

Obrigado!

    
por dmkmills 25.08.2010 / 01:06

5 respostas

11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

Eu usei bash para fazer minha matemática porque sou preguiçoso; mudar isso para o que quiser. Eu aproveito o dia 1 de janeiro de 1970 sendo uma quinta-feira; para os outros dias da semana você teria que aplicar um offset. Cron precisa dos sinais de porcentagem que escaparam.

Verificação 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

Observação Eu escolhi tempos aleatórios para mostrar que isso funcionará se for executado a qualquer momento na quinta-feira, e datas escolhidas que ultrapassem os limites do ano, além de incluir meses nas quatro e cinco quintas-feiras.

Saída:

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
    
por 26.08.2010 / 13:02
5

Uma maneira pode ser usar o utilitário at se você estiver executando o Linux. Você poderia colocar isso no final do seu script:

at X + 2 weeks -f myscript

em que X é a hora em que você deseja executar seu script. Para inicializar, basta chamar at para a hora em que você deseja executá-lo pela primeira vez e, em seguida, a instrução acima mantém a renovação de sua chamada programada.

    
por 25.08.2010 / 01:35
3

Se você puder usar anacron no sistema, as coisas serão muito mais simples. Para usar anacron , você deve instalá-lo e também ter acesso root. Ele 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 (isto é, o RHEL 6.x).

Com anacron , pode-se agendar trabalhos de maneira mais flexível, por exemplo, execute o trabalho X uma vez por semana. Também anacron executa trabalhos 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 no / etc / anacrontab:

14 5 myScript script.sh

Dê uma olhada na página man para detalhes.

    
por 26.08.2010 / 22:25
0

Não tenho certeza se existe uma maneira mais elegante de definir 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 roteiro às 6h da manhã na primeira e terceira quinta-feira do mês.

    
por 25.08.2010 / 01:37
0

Eu o executaria toda semana e verificaria se o número da semana é um número ímpar: se sim, saia.

Isso precisaria de um pouco mais de pensamento para trabalhar de dezembro a janeiro

Talvez o script tenha definido um arquivo de sinalização "ú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.

    
por 17.07.2013 / 04:30