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.

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)


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.