Cronjob é executado a cada duas semanas, no sábado, a partir deste sábado

11

Hoje é sexta-feira, 3 de outubro de 2014 3:58

Quero agendar um cronjob como esse para executá-lo nas seguintes datas:

  1. Sábado, 4 de outubro de 2014 8:00
  2. Sábado, 18 de outubro de 2014 8:00
  3. Sábado, 1 de novembro de 2014 8:00 ...

Então, a cada 2 semanas, no sábado, às 8 horas.

kupa
fonte

Respostas:

27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: número da semana do ano com segunda-feira como primeiro dia da semana, hoje semana 39

10#$(date +%W): converta o date +Wnúmero em decimal e evite confusão na análise da base do shell

$((39%2)): operação do módulo: o resultado é 0 (número da semana par) ou 1 (número da semana ímpar), o resultado desta semana é 1, na próxima semana 0

test 1 -eq 1: teste aritmético (igual), neste caso o resultado é booleano verdadeiro

&& yourCommand: Booleano AND: executado yourCommandapenas se o resultado do comando anterior for boolean true

Observe que o ano pode ter duas semanas ímpares: 53 (este ano) e 1 (próximo ano)

Cyrus
fonte
2
Isso é elegante! Ainda assim, como você observou, tem um caso de canto no 53º sábado do ano, que acontecerá aproximadamente setenta anos a cada quatro séculos.
MadHatter
@Cyrus, obrigado pela resposta, mas se eu escrever * * * * 5 test $ (($ (date +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh, o script não executar, mas se eu escrever * * * * 5 /u02/restore/scripts/test.sh, o script é executado. por que sua expressão não está funcionando? Eu estava apenas testando os casos e descobri que não estava funcionando de alguma forma.
Kup3
1
Meu erro. Cron interpreta% como nova linha. Escape ambos% com a \ em seu cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
Desculpe a trazer de volta essa questão de idade, mas ele não estava funcionando para mim e quando eu tento executar $((10#$(date +%W)%2)) -eq 1 && echo OKminhas tentativas de shell para executar o resultado do cálculo semana: -bash: 1: command not found. Alguma pista do porquê está fazendo isso? Obrigado.
jhuet
3
@ jhuet: testnão é usuário, é um comando. Tente:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4

O que você mostrou é "toda semana". Então o código é:

0 8 * * 6

Tem certeza de que precisa executá-lo a cada duas semanas?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
Glueon
fonte
1
Você pode explicar o comando, por favor
kupa 3/14
1
É melhor usar o que Cyrus forneceu - $ (($ (date +% W)% 2)) "W" representa o número de uma semana no ano. Começando de zero a 53. Se puder ser dividido por dois, será a sua semana a cada segundo. Portanto, o cronjob é executado todas as semanas, mas o 'expr' executa o comando yourCommand apenas se o número da semana puder ser dividido por 2.
Glueon
quando executo o teste $ (($ (date +% W)% 2)) -eq 1 na linha de comando não retorna nada, por que?
Kup3
1
basta executar echo $?depois de executar esse comando, para ver seu código de retorno - que é o que é importante com ele
Ale