A sintaxe que você tentou é realmente ambígua. Dependendo de quantos dias há no mês, alguns meses serão executados em dias ímpares e outros em pares. Isso ocorre porque a maneira como é calculada pega o número total de possibilidades e as divide. Você pode substituir esse comportamento de estratificação, especificando manualmente o intervalo de dias e usando um número ímpar ou par de dias. Como os scripts de dia par nunca seriam executados no 31º dia de meses mais longos, você não perde nada usando 30 dias como base para dias pares, e especificando especificamente para dividi-lo como se houvesse 31 dias, você pode forçar impares dias de execução.
A sintaxe ficaria assim:
# Will only run on odd days:
0 0 1-31/2 * * command
# Will only run on even days:
0 0 2-30/2 * * command
Sua preocupação com os meses que não têm o mesmo número de dias não é importante aqui, porque não há meses com mais dias do que isso e, para fevereiro ruim, o período não coincide com o último dia ou dois, mas não fará mal a ninguém. listado.
A única 'pegadinha' dessa abordagem é que, se você estiver em um ciclo de dias ímpares, após meses com 31 dias, seu comando também será executado no primeiro dia do mês. Da mesma forma, se você estiver forçando um ciclo uniforme, cada ano bissexto causará um ciclo de três dias e o final de fevereiro. Você realmente não pode contornar o fato de que qualquer padrão regular de "todos os dias" nem sempre cai em dias pares ou ímpares todos os meses e, de qualquer forma que forçar isso, você terá uma corrida extra ou perderá uma corrida entre meses com contagem incorreta de dias.
0,2,4...,30,32,34
e isso não importa, os valores fora do intervalo nunca serão correspondidos.0 0 2-30/2 * * command
0 0 2-30/2 * * command
funciona como esperado.Eu acho que uma possibilidade é usar o dia do ano, assim:
É testado para sistemas Unix e Linux.
fonte
test $(($(date +%j) % 2)) == 0 && command
test $(($(date +%s) / 86400 % 2)) == 0 && command
Vamos verificar todos os dias se é um "outro" :-) (
bc
programa obrigatório)(Não tenho certeza se o código aparece corretamente. A
date +%s
parte está entre as apóstrofes posteriores.)fonte
Em geral, eu o executava todos os dias e o script usava a lógica para determinar se deveria ser executado hoje.
Criar um arquivo de status simples informando a última execução e comparando funcionaria com muita facilidade.
Se precisar ser executado por diferentes fontes, torne-o dependente de argumento.
fonte