有没有办法设计cron表达式,每70分钟或210分钟运行一次,即> 60分钟。我试图搜索这个,但无法找到它。
我终于使用了一个包装器脚本,该脚本将执行所需的时间检查,每5分钟调用一次(或最佳重复时间)。
如何在cron表达式中完成这样的任务?
答案 0 :(得分:0)
基本上,你需要每分钟运行你的cron:
* * * * *
让您的脚本确定其上次执行的日期是70或210分钟前 如果是这样,它将继续使用脚本的其余部分 如果没有,它会立即退出。
换句话说,不要尝试将所有内容都放在cron表达式中。
正如Keith Thompson所评论的那样,您可以减少运行该脚本(0 0/5 0?* * *),测试时间为70分钟,或者每30分钟(0 0/30 0 ? * * *
)在210分钟进行测试。
答案 1 :(得分:0)
每70分钟运行一次
* */1.1666
或
每210分钟运行一次
* */3.5
答案 2 :(得分:0)
如果你想每n
分钟运行一次cron,有两种情况需要考虑:
n
分钟(60分可被n
整除)n
(通用)YYYY-MM-DD HH:MM:00
分钟
后者涵盖了OP的案例,但为了保持通用性,我提出了两种情况。
n
分钟(60可被n
整除)这对(n=1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30
)
为此,我们使用定义范围和步长值的组合:
man 5 crontab
:步骤值可以结合使用 有范围。遵循/<number>
指定的范围 跳过该范围内的数字值。例如, 可以在'hours'字段中使用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
此处,从{m>到第59分钟,每隔n分钟执行command1
。
这意味着:
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分钟的跳跃
52
nd和12th
分钟。 注意:您清楚地看到,如果n
没有划分60
完美的,你会遇到问题。例如。 m=0,n=11
继续运行
0,11,22,33,44,55
,所以我们只有5分钟到下一次运行。
n
YYYY-MM-DDTHH:MM:00
分钟
如果你想每隔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
,... command2
将从2015-10-21 07:00:00
开始每隔70分钟运行一次。由于70可以被10整除,并且开始时间在小时内完美开始,我们可以将cron设置为每10分钟运行一次。command3
将从2015-10-21 07:00:00
开始每隔210分钟运行一次。由于210可以被30整除,并且开始时间在小时内完美开始,我们可以将cron设置为每30分钟运行一次。备注: UNIX时间以UTC格式给出。如果你的cron运行在 受夏令时影响的不同时区 时间,建议不要在2和3之间运行命令 点。这可以跳过命令或运行命令 两次(取决于时间是向前还是向后跳跃)
备注: UNIX时间不受闰秒的影响
备注: cron
没有亚秒级准确度