CronJob a cada 25 minutos

12

Eu quero saber se existe uma maneira mais fácil de executar um trabalho a cada 25 minutos. No cronjob, se você especificar o parâmetro minute como * / 25, ele será executado apenas no 25º e 50º minuto de cada hora

    
por Pappu 20.07.2011 / 14:23

6 respostas

14

O comando no crontab é executado com /bin/sh , então você pode usar a expansão aritmética para calcular se o minuto atual do módulo 25 é zero.

*/5 * * * * [ $(( $(date +%s) / 60 % 25 )) -eq 0 ] && your_command

cron executará todo o comando a cada 5 minutos, mas somente se o minuto atual (em minutos desde a época) o módulo 25 for zero, será executado your_command .

Como outros salientaram, um dia não é divisível por 25 minutos, portanto, isso não fará com que your_command seja executado na mesma hora todos os dias, mas será executado a cada 25 minutos.

    
por 21.07.2011 / 14:36
7

A sua melhor aposta é correr aos 20 minutos ou 30 minutos.

A próxima melhor opção é acionar a cada 5 minutos, manter a contagem interna ou o registro de data e hora e executar a cada 5 acionadores, ou se 25 minutos se passaram desde a última execução.

Mais complicado seria calcular os horários corretos para um dia, começando à meia-noite, e aceitar o erro no final do dia. Isso envolveria a duplicação da entrada do crontab para as diferentes horas.

Mais complicado do que isso seria calcular os horários de um mês inteiro, o que envolveria muitas cópias da entrada do crontab para cobrir as diferentes combinações.

Finalmente, você pode implementar o seu próprio sempre no daemon e fazer com que o agendamento seja feito.

    
por 20.07.2011 / 14:35
6

Eu não tenho experiência direta com isso, mas fcron parece fazer o que você quer sair da caixa. De acordo com a sua documentação , pode especificar as frequências:

# Get our mails every 30 minutes 
@ 30 getmails -all 

# make some security tests every 48 hours of system up time, 
# force a mail to be sent to root even if there is no output 
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
    
por 20.07.2011 / 19:59
1

Deixe-me explicar resumidamente qual é o problema aqui. Digitar 25 no campo minuto faz com que cron seja executado quando o minuto da hora atual for igual a 25, ou seja, uma vez por hora. Você pode inserir uma lista de correspondências, o problema é que 60 (minutos de uma hora) não são divisíveis por 25, então você precisa adicionar várias entradas com base na hora. O múltiplo menos comum de 60 & 25 é 300, ou seja, 5 * 60. Por isso, você precisará percorrer 5 horas até retornar ao início original. por exemplo:

0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...

Mas aqui, novamente, 24 (horas por dia) não podem ser divididos por 5, o mínimo múltiplo comum de 5 & 24 é simplesmente 5 * 24 = 120. & assim e assim por diante ...

    
por 21.07.2011 / 13:20
1

Você pode jogar com a hora da última modificação de um arquivo

  • Crie um pequeno script (por exemplo /usr/local/bin/age ) que produzirá a idade de um arquivo:

    #bin/sh
    echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
    

Seu crontab ficaria assim (assumindo que 25 minutos sejam iguais a 1500 segundos se eu estiver certo)

* * * * *  [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500  ] && touch /var/tmp/your_command.offset && your_command

Observe que uso /var/tmp em vez de /tmp porque, de acordo com a FHS , ela não deve ser excluído no desligamento / inicialização do sistema.

    
por 28.07.2011 / 17:25
-2

Acho que o seguinte deve funcionar 0 0/25 * * *

    
por 20.07.2011 / 14:26

Tags