此答案与this 和this 完全相同
如果您想每n 分钟运行一次 cron,有两种情况需要考虑:
- 每
nth 分钟(60 可被n 整除)
- 从
YYYY-MM-DD HH:MM:00 开始的每nth 分钟(通用)
后者涵盖了 OP 的情况,但为了保持通用性,我将介绍这两种情况。
每nth 分钟(60 可被n 整除)
这对 (n=1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30) 有效
为此,我们使用定义范围和步长值的组合:
man 5 crontab: 步长值可以结合使用
与范围。在带有/<number> 的范围之后指定
在范围内跳过数字的值。例如,
0-23/2 可用于“小时”字段中指定命令
每隔一小时执行一次(V7 中的替代方案
标准是0,2,4,6,8,10,12,14,16,18,20,22)。步长值为
也允许在星号之后,因此如果指定要执行的作业
每两小时运行一次,您可以使用*/2。
请看下面的例子:
# 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/n * * * * command1
这里,command1 将从 m 到 59 每隔 n 分钟执行一次。
这意味着:
- 如果
m<=n,它们将始终间隔n 分钟。
例如。 m=2,n=10 :: 作业将在几分钟内运行 2,12,22,32,42,52
- 如果
m>n,它们将始终以n 分钟间隔,除非在
小时的开始。
例如。 m=12,n=10 :: 作业将在几分钟内运行
12,22,32,42,52。所以这里我们之间有 20 分钟的跳跃
52nd 和 12th 分钟。
注意:你清楚地看到如果n 不除60
完美,你会有问题。例如。 m=0,n=11 继续运行
0,11,22,33,44,55,所以我们距离下一次运行只有 5 分钟。
从YYYY-MM-DDTHH:MM:00开始的每nth分钟
如果你想每n 分钟运行一次 cron,你不能用 cron 干净地做到这一点,但这是可能的。为此,您需要在测试检查时间的 cron 中进行测试。这最好在查看 UNIX 时间戳时完成,即自 1970-01-01 00:00:00 UTC 以来的总秒数。假设我们想从 McFly 到达 Riverdale 的那一刻开始:
% date -u -d '2015-10-21 07:28:00' +%s
1445412480
# 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
* * * * * mintestcmd "2015-10-21 07:28:00" 7 && command1
*/10 * * * * mintestcmd "2015-10-21 07:00:00" 70 && command2
*/30 * * * * mintestcmd "2015-10-21 07:00:00" 210 && command3
mintestcmd 定义为
#!/usr/bin/env bash
starttime=$(date -d "$1" "+%s")
# return UTC time
now=$(date "+%s")
# get the amount of minutes
delta=$(( (now - starttime) / 60 ))
# set the modulo
modulo=$2
# do the test
(( delta >= 0 )) && (( delta % modulo == 0))
在上面的例子中我们有:
-
command1 将在 2015-10-21 07:28:00、2015-10-21 07:35:00、2015-10-21 07:42:00、2015-10-21 07:49:00、...上每 7 分钟运行一次
-
从
2015-10-21 07:00:00 开始,command2 将每 70 分钟运行一次。由于 70 可以被 10 整除,并且开始时间完美地从整点开始,我们可以将 cron 设置为每 10 分钟运行一次。
-
从
2015-10-21 07:00:00 开始,command3 将每 210 分钟运行一次。由于 210 可以被 30 整除,并且开始时间完美地从整点开始,我们可以将 cron 设置为每 30 分钟运行一次。
备注: UNIX 时间以 UTC 表示。如果您的 cron 在
受夏令时影响的不同时区
时间,建议不要在2到3之间运行命令
点。这可以跳过命令或运行命令
两次(取决于时间是向前跳还是向后跳)
备注:UNIX时间不受闰秒影响
备注:cron没有亚秒级精度