Tenho uma programação no meu crontab pessoal em um sistema Alpine Linux 3.20 que roda às 00:10 de terça a domingo (ou seja, todos os dias da semana, exceto segundas-feiras):
10 0 * * 2-7 "$HOME/local/sbin/backup.sh" prune-daily
Isso parece disparar nas segundas-feiras também. Por quê?
Note que meu relatório inicial deu os sintomas como "Não roda aos domingos". Eu me lembrei errado do que aconteceu, desculpe. Corrigi a descrição dos sintomas após investigá-los mais a fundo. O cronograma do crontab está correto, como estava desde o início.
O familiar daemon Vixie Cron usa os inteiros de 0 a 7 para designar os dias da semana, de domingo a domingo (tanto 0 quanto 7 são domingo). Um cronograma com
2-7
o campo dia da semana seria executado, portanto, nas terças, quartas, ... e domingos. Usar 7 para designar domingos é uma extensão do padrão POSIX paracrontab
.Se habilitado, o daemon Cron padrão no Alpine Linux não é o daemon Vixie Cron, mas uma implementação mínima incorporada ao BusyBox.
O daemon BusyBox Cron não usa o inteiro 7 para domingos e permite apenas sete inteiros para designar o dia da semana, de 0 a 6, com 0 usado para domingos, como é evidente em seu código-fonte .
Concluindo, o cronograma do crontab precisa ser modificado para continuar sendo executado em todos os dias da semana, exceto segundas-feiras:
Ou, alternativamente,
O motivo pelo qual o agendamento é acionado todos os dias quando um intervalo de dias da semana terminando em 7 é usado é devido a um loop no código que tenta determinar em quais dias da semana um trabalho com uma especificação de intervalo deve ser adicionado:
O loop é executado do início do intervalo até o fim, mas incrementa usando
n1 = (n1 + 1) % modvalue
(onden1
é o número do dia da semana emodvalue
é 7, para sete dias). Como isso não pode chegar a 7 (vai até um máximo de 6 e então volta para 0), ele dispara um "failsafe", que encerra o loop após 1024 iterações. Até então, o trabalho foi adicionado a todos os dias da semana (os elementos de 0 a 6 naary
matriz foram definidos como 1).Como o código manipula valores de um único dia, como
2
(terça-feira) e3,4
(dois dias, quarta-feira e quinta-feira) como intervalos de valores únicos (2-2
e3-3,4-4
respectivamente), um único dígito7
no campo do dia da semana também causaria o mesmo problema.