钟表偏移五分钟时间表


22

是否可以抵消设置为每5分钟运行一次的cron脚本?

我有两个脚本,脚本1从一个数据库中收集一些数据并将其插入到另一个数据库中,脚本2提取此数据和许多其他数据,并从中创建一些漂亮的报告。这两个脚本需要每5分钟运行一次。我想将脚本2偏移一分钟,以便它可以根据新数据创建报告。例如,我希望脚本1 每小时:00, :05, :10, :15 [...]运行:01, :06, :11, :16 [...]一次,脚本2 每小时运行一次。脚本不相互依赖,并且脚本2必须运行,无论脚本1是否成功。但是,如果报告中可以包含最新数据,将很有用。cron有可能吗?

发布;
我已经考虑过在shell脚本中同时使用这两个命令,因此它们会彼此立即运行,但这是行不通的,有时脚本1可能会挂起以等待外部API等,因此可能要花15分钟才能运行,但是脚本2必须每5分钟运行一次,这样执行此操作将停止/延迟脚本2的执行。如果我可以在Cron中进行设置,则意味着脚本2可以运行,而不管脚本1在做什么

Answers:


14

您可以随时使用来运行脚本cron。如果要每5分钟运行一次脚本1,则可以这样开始:

*/5 * * * * /path/to/script1

但这实际上只是以下方面的简写:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

如果要在脚本1之后一分钟运行脚本2,可以执行以下操作:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

您也可以这样做:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

然后在脚本2的开头,睡一分钟:

sleep 60

4
将睡眠置于脚本本身中是一个丑陋的hack,这使得从提示符处手动运行脚本很痛苦。有一种不太丑陋的方法可以通过将睡眠作为crontab条目的一部分来进行破解,但是一种更为优雅的方法是使用正确的crontab表示法来抵消作业,您的答案没有涉及。
Caleb 2012年

39

crontab的分钟输入字段接受一个“递增”运算符,这有点令人困惑,因为看起来它应该是数学上的“除以”运算符,但不是。您最经常会看到它使用了类似以下内容的东西。请注意,这不会找到可被五整除的数字,而是从集合中获取每五分之一的数字:

 */5 * * * * command

这告诉cron匹配/5分钟数范围0-59(*)中的每五个项目(),但是您可以像这样更改该集合:

 1-59/5 * * * * command

这将占用1-59中的每五个项目,在第6、11、16分钟运行命令。

如果您需要超过一分钟的细粒度偏移,则可以使用sleep命令作为crontab的一部分对其进行破解,如下所示:

 */5 * * * * sleep 15 && command

这将每五分钟运行一次您的作业,但是该命令直到分钟后15秒才真正开始。对于短暂的工作,几秒钟之后的事情很重要,但是您不想迟到一整分钟,这是一个非常简单的技巧。


1
这是一个比公认的更好的答案。通过范围设置偏移量比休眠更清洁。
ND怪胎

11

您可以使用+符号表示时间偏移。例如,要在运行:01, :06, :11, :16 [...],请创建一个任务,例如

*/5+1 * * * * command

7
这在某些版本的cron中似乎不起作用
jhoff 2013年

1
您正在使用哪个cron版本支持此语法?Cronie似乎不支持它。
马修·G

我在CentOS7上安装了Cronie,因​​此,我不会先尝试此解决方案。
AnneTheAgile

1

这为我工作:

1/5 * ? * * *

其中1是偏移分钟。因此,如果要偏移三分钟,请执行以下操作:

3/5 * ? * * *

我在AWS计划设置中使用了此功能

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.