Por que meu cronjob foi lançado no dia ruim?

3

Eu queria lançar um emprego no início de cada mês, mas apenas nos dias da semana.

Para fazer isso, eu adicionei esta linha no arquivo / etc / crontab:

7 0 3-5 * 1-5  root  ( test "'date '+\%d''" = "03" || test "'date '+\%u''" = "1" ) && /path/to/my/script.sh

O que era esperado: o script.sh foi lançado no 1º dia da semana entre o dia 3 e o dia 5 do mês (a parte "teste" está lá apenas para ter certeza de que será lançada uma vez).

Funciona muito bem e este mês, no dia 3, o cronjob foi executado.

Mas, infelizmente, por um motivo desconhecido, também foi lançado hoje, dia 8 de junho, na segunda-feira. Eu posso entender que a parte "teste" funciona ( test "date '+%u'" = "1" é verdadeiro, e é lógico), mas a parte "cron" não deve ser verdadeira ( 7 0 3-5 * 1-5 não é verdade, nós somos o 8º).

Então, eu estava pensando, fiz algo errado ou existe um problema mais profundo?

Obrigado!

    
por Sébastien C. 08.06.2015 / 10:35

1 resposta

4

Esse comportamento reconhecidamente surpreendente está documentado em man 5 crontab (ênfase minha):

  

Os comandos são executados pelo cron (8) quando o minuto, hora e mês   campos de ano correspondem à hora atual, e quando pelo menos um de   os campos de dois dias (dia do mês ou dia da semana) correspondem aos   tempo (veja '' Nota '' abaixo).

     

[...]

     

Nota: O dia da execução de um comando pode ser especificado por dois   campos - dia do mês e dia da semana. Se ambos os campos forem   restrito (isto é, não é *), o comando será executado quando um dos dois   campo corresponde à hora atual . Por exemplo, '' 30 4 1,15 * 5 ''   faria com que um comando fosse executado às 4:30 da manhã no dia 1 e no dia 15 de cada   mês, mais toda sexta-feira.

Então, o que você precisa fazer é fazer com que seu comando teste o tempo. Assim como você faz para executá-lo apenas uma vez. Como isso está ficando complicado, eu recomendaria que a verificação fosse feita em seu próprio script e depois ativasse o comando cron todos os dias do mês relevante. Algo como

## Check if this is a weekday 
[ $(date '+%u') -le 5 ] && [ $(date '+%u') -ge 1 ] || exit;
## Make sure it only runs once. If yesterday was also a weekday and 
## date >=3 and <=5, we can assume the script ran then and should exit. 
[ $(date -d yesterday '+%u') -le 5 ] && [ $(date -d yesterday '+%u') -ge 1 ] && 
 [ $(date -d yesterday '+%d') -le 3 ] && [ $(date -d yesterday '+%d') -ge 5  ] && exit;
## Rest of your script goes here
[...]

Então, a partir de cron , inicie seu script apenas nos dias 3 a 5 de cada mês:

7 0 3-5 * *  /path/to/my/script.sh
    
por terdon 08.06.2015 / 14:04

Tags