Se você deseja executar um cron a cada n
minuto, existem algumas opções possíveis, dependendo do valor de n
.
n
divide 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)
Aqui, a solução é simples, fazendo uso da /
notação:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
m-59/n * * * * command
Acima, n
representa o valor n
e m
representa um valor menor que n
ou *
. Isso executará o comando nos minutosm,m+n,m+2n,...
n
NÃO divide 60
Se n
não dividir 60, você não pode fazer isso de forma limpa com o cron, mas é possível. Para fazer isso você precisa colocar um teste no cron onde o teste verifica o tempo. A melhor maneira de fazer isso é olhar o carimbo de data / hora UNIX, o total de segundos desde então 1970-01-01 00:00:00 UTC
. Digamos que queremos começar a executar o comando pela primeira vez quando Marty McFly chegou em Riverdale e, em seguida, repeti-lo a cada n
minuto depois.
% date -d '2015-10-21 07:28:00' +%s
1445412480
Para que um cronjob seja executado a cada 42
minuto após `2015-10-21 07:28:00 ', o crontab ficaria assim:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
* * * * * minutetestcmd "2015-10-21 07:28:00" 42 && command
com minutetestcmd
definido como
#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes (using integer division to avoid lag)
minutes=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( now >= starttime )) && (( minutes % modulo == 0 ))
Observação: tempo do UNIX não é influenciado por segundos bissextos
Observação: cron
não tem precisão inferior a um segundo