Se vuoi eseguire un cron ogni n
minuto, ci sono alcune possibili opzioni a seconda del valore di n
.
n
divide 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)
Qui, la soluzione è semplice utilizzando la /
notazione:
# 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
In quanto sopra, n
rappresenta il valore n
e m
rappresenta un valore minore di n
o *
. Questo eseguirà il comando nei minutim,m+n,m+2n,...
n
NON divide 60
Se n
non divide 60, non puoi farlo in modo pulito con cron ma è possibile. Per fare questo è necessario mettere un test nel cron dove il test controlla l'ora. È meglio farlo guardando il timestamp UNIX, i secondi totali da allora 1970-01-01 00:00:00 UTC
. Diciamo che vogliamo iniziare a eseguire il comando la prima volta quando Marty McFly è arrivato a Riverdale e poi ripeterlo ogni n
minuto dopo.
% date -d '2015-10-21 07:28:00' +%s
1445412480
Affinché un 42
cronjob venga eseguito ogni minuto dopo "2015-10-21 07:28:00", il crontab dovrebbe apparire così:
# 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
definito come
#!/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 ))
Nota: l' ora UNIX non è influenzata dai secondi intercalari
Nota: cron
non ha una precisione inferiore al secondo