O número 31 implica necessariamente no final do mês em um cron job?

12

Para o cron job, sabemos que podemos definir o tempo como abaixo.

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

O que eu quero saber é que, quando definirmos o dia do mês 31, isso significa o final de cada mês, embora o mês não tenha o dia 31. Espero receber resposta.

Obrigado antecipadamente

    
por squillman 18.08.2009 / 12:08

5 respostas

21

Não, 31 significa 31.

No entanto, você pode fazer alguns truques. Defina o trabalho para ser executado em qualquer dia que possa ser o último dia do mês (ou seja, 28-31 no campo do dia do mês) e, em seguida, substitua o comando por uma expressão shell que inclua um teste na data que protege o comando:

0 0 28-31 * * [" date +%m "!=" date --date=tomorrow +%m "] & & comando

A expressão dentro dos colchetes de teste apenas pergunta se o número do mês de hoje é diferente do número do mês de amanhã, o que obviamente só será verdadeiro no último dia do mês. Note que a forma desta expressão depende do seu local date - você pode precisar ajustá-la se você não tiver a versão atual do GNU.

Eu deveria dizer que eu não inventei isso - eu achei isso com um google rápido (que o pôster original deveria ter feito ele mesmo, um pôster ruim!) em um post na lista de discussão por um Matthew Jarvis. Eu imagino que isso é muito mais do que um truque padrão do antigo feitiço unix.

    
por 18.08.2009 / 14:18
10

Não, acho que o melhor que você pode fazer é correr à meia-noite do primeiro dia do mês ou configurar linhas individuais de crontab para cada mês (ou pelo menos uma linha por meses com 28,29,30 e 31 dias )

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command
    
por 18.08.2009 / 12:12
4

Eu não acho que você pode fazer isso facilmente no crontab .

Uma opção seria definir cron para executar o script todos os dias e, em seguida, fazer o próprio script verificar se é o último dia do mês.

    
por 18.08.2009 / 12:32
3

Eu acho que o cron tem um caractere especial 'L' destinado a esse propósito:

*    *    L    *    *    your_script.sh 

executaria seu script no último dia de cada mês

Por outro lado,

*    *    0    *    *    your_script.sh

Você pode até especificar algo como:

*    *    *    *    1,5L    your_scrript.sh

para executar o script na última segunda e sexta-feira de cada mês

ou

*    *    *    *    1    your_script.sh

para executar o script toda segunda-feira à meia-noite.

    
por 21.05.2012 / 14:58
0

Isso fará o trabalho:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

exit 1
    
por 21.08.2015 / 21:54

Tags