Cronjob para o primeiro dia do mês, exceto domingo

2

Eu tenho essa entrada no meu crontab:

0 0 1-2 * 1-6

É correto que ele seja exibido às 00:00, 1º ou 2º dia do mês, de segunda a sábado? Por exemplo, se o primeiro dia for domingo, então não será executado, certo? Mas, em vez disso, ele executaria um cronjob no segundo dia do mês, porque não será um domingo.

    
por Alexander Kim 01.02.2014 / 07:34

1 resposta

5

Se o primeiro dia do mês for um domingo, será executado.

O motivo é que as duas condições "dia do mês" (terceiro campo) e "dia da semana" (quinto campo) não estão conectadas com um E (ambas devem ocorrer), mas com um OR (qualquer uma deve ocorrer) . De man 5 crontab :

Note: The day of a command's execution can be specified by two fields -- day of month, and day of week. If both fields are restricted (ie, are not *), the command will be run when either field matches the current time. For example, ''30 4 1,15 * 5'' would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.

Assim, o seu cronjob será executado à meia-noite a cada 1 e 2 do mês e adicionalmente todos os Seg, Ter, Qua, Qui, Sex e Sáb do mês. / p>

Se você precisar executar o comando apenas uma vez por mês, mas não no domingo, ao escrever seu comentário, você deve verificar a data no próprio comando .

Estas são as condições para executar o comando:

IF (date is 1st day of month AND date is not Sunday) 
    OR (date is 2nd day of month AND yesterday was Sunday) 
THEN run command

Você pode escrever dois cronjobs:

0 0 1 * * test $(date +\%u) -eq 7 || echo "today's the 1st day of the month but not Sun"
0 0 2 * * test $(date +\%u) -eq 1 && echo "today's Mon (=yesterday was Sun) and the 2nd day of the month"

O primeiro cronjob será executado todo primeiro dia do mês à meia-noite:

  • date +%u retorna um inteiro onde 1 é Mon, 2 é Tue, etc. (o '%' precisa ser que escapou em um crontab).

  • test verifica se $(date +%u1) é igual a 7 (domingo).

  • || é o operador OR booleano , ele reage ao valor de retorno do comando anterior. Se test retornar FALSE, o restante do comando será executado.

O segundo cronjob será executado a cada dois dias do mês à meia-noite:

  • Novamente, date +%u retorna um inteiro onde 1 é Mon, 2 é Tue, etc.

  • test verifica se $(date +%u1) é igual a 1 (segunda-feira).

  • && é o operador AND booleano , se test retornar TRUE, depois o restante do comando é executado.

por 01.02.2014 / 08:48