2014-12-10 52 views
7

我遇到了一个情况,我认为每55分钟运行一个cron作业实际上是在小时的最后一小时之后55分钟运行的。实际上,这不是一个cron工作,但它是一个使用cron语法的PHP scheduling application克朗“步骤”如何工作?

当我要求此应用程序每55分钟计划一次作业时,它会创建一个类似于以下内容的crontab行。

*/55 * * * * 

此行的crontab结束运行作业每55分钟。相反,工作时间在55分钟后,并在一小时的时间。我不希望这样。我已经运行这个虽然cron tester,并验证不良行为是正确的cron行为。

这使我查找/实际上的含义。当我看到cron manual时,我得知斜线表示“步骤”,但手册本身有点模糊,因此这意味着

步长值可以与范围结合使用。在“<number>”范围之后指定在该范围内跳过数字值。例如,可以在小时字段中使用“0-23/2”以指定每隔一小时执行一次命令(V7标准中的替代方法是“0,2,4,6,8,10,12,14,16,18,20,22"”)。星号后也允许执行步骤,因此如果您想说“每两小时”,只要使用‘*/2’。

本手册的描述(‘通过的范围内指定数字的值的跳跃’)是一点点模糊,并且‘每两小时’的例子是有点误导(这是大概是什么导致了应用程序的bug)

于是,两个问题:

  1. unix cron程序如何使用“步骤”信息(斜线后的数字)来决定是否应该跳过运行作业? (模块化的部门?如果是这样,在什么情况下决定一个“真正的”运行,哪些决定没有?或者是别的什么?)

  2. 是否可以配置一个unix cron作业来运行每个“ N“分钟?

+0

@shellter我不想在一小时后只运行55次,我想每55分钟运行一次。时间过后在55点跑,每小时一次。更重要的是,我想知道“步骤”功能实际上是如何工作的,以及是否可以说“每N分钟”,而不管N是什么。 – 2014-12-10 23:16:15

+0

对于反对/接近 - 这个问题是关于cron的调度逻辑是如何被编程的**,以支持使用cron逻辑的PHP程序包编写软件。这似乎很主题 – 2014-12-11 17:18:44

回答

8

步长值可以与范围结合使用。在范围 和“<number>”之间指定数字在整个范围内的跳跃。例如,对于 示例,可以在小时字段中使用“0-23/2”来指定每隔1小时执行一次命令 (V7标准中的替代项为 “0,2,4,6,8,10,12,14,16,18,20,22”)。星号后 也允许采用步骤,所以如果您想要说“每两小时”,只需使用“*/2”即可。

的“范围”在这里被称为是/之前给定的范围内,这是时间的特定字段中的范围的子范围。第一个字段指定一小时内的分钟数,因此*/...指定的范围是从0到59.第一个字段*/55指定55的倍数的所有分钟数(在0-55范围内),即,每小时后0分钟和55分钟。

同样,0-23/2或第二(小时)*/2字段指定所有小时数是2的

倍数(范围0-23内)如果指定比在0开始以外的范围内,数(例如N)在/之后指定每个分钟/小时/等在范围的下限处开始。例如,第二栏中的3-23/7表示从03:00(03:00,10:00,17:00)开始的每7小时。

当您想要将时间间隔平均分配到下一个更高的时间单位时,这种方式效果最佳。例如,您可以轻松地指定每1,2,3,4,5,6,10,12,15,20或30分钟或每1,2,3,4,6或12个事件发生的事件小时。 (感谢巴比伦人选择具有这么多好的除数的时间单位)。

不幸的是,cron没有在一个小时以上的时间范围内“每55分钟”的概念。

如果你想每55分钟运行一次作业(比如在00:00,00:55,01:50,02:45等),你必须间接地执行作业。一种方法是安排脚本每5分钟运行一次;脚本然后检查当前时间,并且每11次调用一次它的工作。

或者你可以在你的crontab文件中使用多行在00:00,00:55,01:50等处执行相同的工作 - 除了一天不是55分钟的倍数。如果您不介意每天,每周或每月的时间间隔更长或更短,您可以编写一个程序,以便根据需要生成一个包含尽可能多条目的大型crontab,它们都会在指定的时间运行相同的命令。

+0

谢谢基思,这比手册更有帮助。 “倍数”是否合适?如果我指定“1-59/55”,我最终会得到一小时一小时和一小时后56小时的工作。准确地说一个步骤将会是1.始终运行一个范围的第一个数字2.然后以该范围中指定的量向前跑,如果产生的前面的跳跃仍然在相同的范围内,则运行。3.重复2,直到产生的跳跃不在相同的范围内 – 2014-12-11 00:13:29

+1

感谢Kieth,总是需要至少两个程序员以正确的方式拧上灯泡:) – 2014-12-11 00:29:40

+0

这是否意味着几个月(从1开始),*/2是奇数个月还是偶数?那么*/2和1-12/2月之间有区别吗? – 2016-09-27 17:41:50