用于每个的cron表达式>;60分钟的工作
有没有办法将cron表达式设计为每70分钟或210分钟运行一次,即>60分钟。我试图搜索这个,但没能找到 最后,我使用了一个包装器脚本,它将执行所需的时间检查,每5分钟调用一次(或最佳循环时间)用于每个的cron表达式>;60分钟的工作,cron,Cron,有没有办法将cron表达式设计为每70分钟或210分钟运行一次,即>60分钟。我试图搜索这个,但没能找到 最后,我使用了一个包装器脚本,它将执行所需的时间检查,每5分钟调用一次(或最佳循环时间) 如何在cron expression中完成这样的任务?基本上,您需要每分钟运行一次cron: * * * * * 并让您的脚本确定其最后一次执行日期是70分钟前还是210分钟前。 如果是,它将继续执行脚本的其余部分。 如果没有,它将立即退出 换句话说,不要尝试将所有内容都放在cron表达式中 正如所评
如何在cron expression中完成这样的任务?基本上,您需要每分钟运行一次cron:
* * * * *
并让您的脚本确定其最后一次执行日期是70分钟前还是210分钟前。如果是,它将继续执行脚本的其余部分。
如果没有,它将立即退出 换句话说,不要尝试将所有内容都放在cron表达式中 正如所评论的,您可以不太频繁地运行该脚本(0 0/50?***),测试时间为70分钟,或者每30分钟(
0 0/30 0?***
)运行一次测试时间为210分钟。每70分钟运行一次
* */1.1666
或
每210分钟跑一次
* */3.5
这个答案与和完全相同
如果你想运行一个CRON,每一个代码< n>代码>分钟,有两个案例需要考虑:
- 每
th分钟(60可被n
整除)n
- 每
从n
yyyyy-MM-DD HH:MM:00开始的第h分钟(通用)
n
th分钟(60可被n
整除)
这适用于(n=1、2、3、4、5、6、10、12、15、20、30
)
为此,我们使用定义范围和步长值的组合:
man 5 crontab
:阶跃值可以结合使用
有射程。在带有/
的范围之后指定
在整个范围内跳过数字的值。例如
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分钟执行一次
这意味着:
- 如果
,则它们将始终间隔mn
分钟,但在 一小时的开始。 例如,m=12,n=10作业将在几分钟内运行n
。这里我们有一个20分钟的跳跃 第52分钟和第12分钟12,22,32,42,52
n
不除以60
很好,你会有问题的。例如,m=0,n=11
0,11,22,33,44,55
,因此我们只有5分钟的时间进行下一次跑步
从YYYY-MM-DDTHH:MM:00开始的每n
th分钟
如果您想每隔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
开始时间=$(日期-d“$1”+%s)
#返回UTC时间
现在=$(日期“+%s”)
#获取分钟数
增量=$((现在-开始时间)/60))
#设模
模=2美元
#做测试
((增量>=0))&(((增量%模==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
没有亚秒精度好吧,让它在设定的小时数后运行是可能的,但大约70分钟?我不这么认为。你可以在
上使用。可能的重复使用一个表达式是无法做到的;有些变通方法使用多个表达式(请参阅)。我已升级我的答案以包含Keith的评论。不,这将在每小时后0到35分钟运行。@KeithThompson是的。修正了。这是一种方法,但在70分钟的时间间隔内,cron作业只能每10分钟执行一次,在210分钟内,它可以每30分钟运行一次。