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 a7
(domingo). -
||
é o operador OR booleano , ele reage ao valor de retorno do comando anterior. Setest
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 a1
(segunda-feira). -
&&
é o operador AND booleano , setest
retornar TRUE, depois o restante do comando é executado.