Якщо ви хочете запускати cron кожні n
хвилини, існує кілька можливих варіантів залежно від значення n
.
n
ділить 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)
Тут рішення просто, використовуючи /
позначення:
# 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
У наведеному вище, n
представляє значення n
і m
являє собою значення менше, ніж n
або *
. Це виконає команду за хвилиниm,m+n,m+2n,...
n
НЕ ділить 60
Якщо n
не розділити 60, ви не можете зробити це чисто за допомогою cron, але це можливо. Для цього вам потрібно поставити тест у cron, де тест перевіряє час. Це найкраще зробити, якщо переглянути метку часу UNIX, загальну кількість секунд після 1970-01-01 00:00:00 UTC
. Скажімо, ми хочемо почати виконувати команду вперше, коли Марті Макфлай прибув до Рівердейла, а потім повторювати це кожні n
хвилини пізніше.
% date -d '2015-10-21 07:28:00' +%s
1445412480
Щоб cronjob запускався кожну 42
другу хвилину після `2015-10-21 07:28:00 ', crontab буде виглядати так:
# 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
з minutetestcmd
визначеним як
#!/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 ))
Примітка: на час UNIX не впливають високосні секунди
Примітка: cron
не має точності до секунди