Si desea ejecutar un cron cada n
minuto, hay algunas opciones posibles según el valor de n
.
n
divide 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)
Aquí, la solución es sencilla haciendo uso de la /
notación:
# 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
En lo anterior, n
representa el valor n
y m
representa un valor menor que n
o *
. Esto ejecutará el comando en los minutosm,m+n,m+2n,...
n
NO divide 60
Si n
no divide 60, no puede hacerlo limpiamente con cron, pero es posible. Para hacer esto, necesita poner una prueba en el cron donde la prueba verifica la hora. Esto se hace mejor cuando se mira la marca de tiempo de UNIX, el total de segundos desde 1970-01-01 00:00:00 UTC
. Digamos que queremos comenzar a ejecutar el comando la primera vez que Marty McFly llegó a Riverdale y luego repetirlo cada n
minutos más tarde.
% date -d '2015-10-21 07:28:00' +%s
1445412480
Para que un cronjob se ejecute cada 42
minuto después de `2015-10-21 07:28:00 ', el crontab se vería así:
# 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
con 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 ))
Observación: el tiempo UNIX no se ve afectado por los segundos intercalares
Observación: cron
no tiene una precisión inferior a un segundo