Por que a entrada do vixie cron para rodar a cada dois dias é executada em dias consecutivos a cada 4ª vez?

2

Eu tenho uma entrada no meu arquivo crontab:

14 17 * * */2 python /home/pi/scripts/irrigate_5mins.py >/dev/null 2>&1

A intenção é executar o comando a cada dois dias, que é o que a página de manual ( man 5 crontab ) diz é o que o */2 faz. A cotação real da página do manual é:

Steps are also permitted after an asterisk, so if you want to say ''every two hours'', just use ''*/2''

O comportamento real é que o comando é executado com um padrão de recorrência de 2, 2, 2, 1, 2, 2, 2, 1 e assim por diante. Assim, por exemplo, em março / abril, o comando foi executado nos dias 15, 17, 18, 20, 22, 24, 25, 27, 29, 31, 1º, 3º, 5º, 7º, 8º, 10º, 12º, onde as datas em negrito são aquelas em que o comando foi executado no dia anterior.

Então, minha pergunta é: por que está se comportando assim e há uma maneira (fácil) de fazer o que se espera?

Informações do sistema:

root@pi:~# uname -a
Linux pi 4.9.28+ #998 Mon May 15 16:50:35 BST 2017 armv6l GNU/Linux
root@pi:~# lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie

Pode ou não ser relevante que o sistema esteja conectado a um timer, o que provoca uma reinicialização a cada 24 horas.

    
por nickcrabtree 28.05.2018 / 12:08

2 respostas

2

Ao especificar */2 no campo do dia da semana, você executará em dias pares. Mesmo dias da semana são segundas, quartas, sextas e domingos. (Na verdade, esses são os dias ímpares, hmm, ainda ...)

Se você quiser executar o trabalho em intervalos um pouco mais regulares, use o campo do dia do mês (o terceiro campo). Observe que nos meses com um número ímpar de dias, isso fará com que o trabalho seja pulado um dia quando o mês seguinte começar: ..., 28, 30 (não no dia 31, não no dia o 1º), 2º, 4º, etc.

Você poderia contornar isso adicionando um cronograma para meses com dias pares e um cronograma separado para meses com um número ímpar de dias (embora eu realmente não tenha pensado nisso corretamente para saber se isso faria com que ele se encaixasse corretamente ).

Outra possibilidade seria ter o próprio horário de trabalho usando at em vez de usar cron . Esta seria definitivamente uma solução mais "hacker" e possivelmente falharia se a tarefa terminasse de forma anormal entre começar a ser executada e reagendar com êxito em dois dias ou se o sistema estivesse inativo na próxima execução programada.

    
por 28.05.2018 / 12:15
1

Eu planejaria o cron job para ser executado todos os dias. Em seguida, o script pode decidir se o dia do ano é um número par: se não, saia.

import datetime
today = datetime.date.today()
doy = int(today.strftime("%j"))
if (doy % 2 == 1): exit()
... 
    
por 28.05.2018 / 20:35

Tags