我遇到的情况是,我认为每55分钟运行一次的cron工作实际上是在一小时后的55分钟和最高时间运行.实际上,它不是一个cron工作,但它是一个使用cron语法的PHP调度应用程序.
当我要求此应用程序每隔55分钟安排一个作业时,它会创建一个如下所示的crontab行.
*/55 * * * *
Run Code Online (Sandbox Code Playgroud)
这个crontab行最终没有每55分钟运行一次作业.相反,工作在工作时间后的55分钟和最高时间运行.我不希望这样.我通过cron测试器运行它,它验证了不良行为是正确的cron行为.
这让我想起了/实际意味着什么.当我查看cron手册时,我学会了斜线表示"步骤",但手册本身有点模糊,这意味着
步长值可与范围结合使用.在带有"
<number>" 的范围之后,指定在该范围内跳过数字的值.例如,0-23/2可以在小时字段中使用" "来指定每隔一小时执行一次命令(V7标准中的替代方法是"0,2,4,6,8,10,12,14,16,18,20,22").星号后也允许步骤,所以如果你想说"每两个小时",只需使用"*/2".
手册的描述("指定通过范围跳过数字的值")有点模糊,"每两个小时"的例子有点误导(这可能导致应用程序中的错误)
那么,有两个问题:
unix cron程序如何使用"步骤"信息(斜杠后的数字)来决定是否应该跳过运行作业?(模块化划分?如果是这样,关于什么?决定"真正"运行的条件是什么,哪些决策不是?或者是其他什么?)
是否可以将unix cron作业配置为每隔"N"分钟运行一次?
Kei*_*son 17
步长值可与范围结合使用.在带有"
<number>" 的范围之后,指定在该范围内跳过数字的值.例如,0-23/2可以在hours字段中使用" "来指定每隔一小时执行一次命令(V7标准中的替代方法是"0,2,4,6,8,10,12,14,16,18,20,22").星号后也允许步骤,所以如果你想说"每两个小时",只需使用"*/2".
这里所指的"范围"是在给定的范围之前给出/的范围,该范围是特定字段的时间范围的子范围.第一个字段指定一小时内的分钟,因此*/...指定范围从0到59.第一个字段*/55指定所有分钟(在0-55范围内)是55的倍数 - 即每小时后0和55分钟.
类似地,0-23/2或*/2在第二个(小时)字段中指定所有小时数(在0-23范围内)是2的倍数.
如果指定的范围从at开始0,则指定从范围的下限开始的每N分钟/小时/等之后的数字(例如N).例如,在第二个字段中表示从03:00(03:00,10:00,17:00)开始的每7小时./3-23/7
当你想要的间隔恰好分成下一个更高的时间单位时,这种方法效果最好.例如,您可以轻松指定每1,2,3,4,5,6,10,12,15,20或30分钟或每1,2,3,4,6或12个事件发生的事件小时.(感谢巴比伦人选择有这么多优秀除数的时间单位.)
不幸的是,cron在一个多小时的时间范围内没有"每55分钟"的概念.
如果你想每55分钟(比如00:00,0:55,01:50,02:45等)开始工作,你必须间接地去做.一种方法是安排脚本每5分钟运行一次; 然后脚本检查当前时间,并且每调用一次它的工作只执行一次.
或者您可以在crontab文件中使用多行来在00:00,00:55,01:50等处运行相同的作业 - 除了一天不是55分钟的倍数.如果您不介意每天,每周或每月更长或更短的间隔,您可以编写一个程序来生成一个包含所需数量的大型crontab,并在指定时间运行相同的命令.