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?
É 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
0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
$((10#$(date +%W)%2)) -eq 1 && echo OK
minhas tentativas de shell para executar o resultado do cálculo semana:-bash: 1: command not found
. Alguma pista do porquê está fazendo isso? Obrigado.test
não é usuário, é um comando. Tente:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
O que você mostrou é "toda semana". Então o código é:
Tem certeza de que precisa executá-lo a cada duas semanas?
fonte
echo $?
depois de executar esse comando, para ver seu código de retorno - que é o que é importante com ele