如何做Cron" Steps"工作?

时间:2014-12-10 23:03:26

标签: unix cron

我遇到的情况是,我认为每55分钟运行一次的cron作业实际上是在小时后的55分钟。实际上,它不是一个cron工作,但它是PHP scheduling application使用cron语法。

当我要求此应用程序每隔55分钟安排一个作业时,它会创建一个如下所示的crontab行。

*/55 * * * *

此crontab行每隔55分钟就会运行一个作业。相反,工作在工作时间后的55分钟和最高时间运行。我不希望这样。我通过cron tester运行了这个,它验证了不良行为是正确的cron行为。

这让我想起/实际意味着什么。当我查看cron manual时,我学会了斜线表示"步骤",但手册本身有点模糊,这意味着

  

步长值可与范围结合使用。使用&#34; <number>&#34;指定通过范围跳过数字的值。例如,&#34; 0-23/2&#34;可以在hours字段中使用,以指定每隔一小时执行一次命令(V7标准中的替代方法是&#34; 0,2,4,6,8,10,12,14,16,18,20,22")。星号后也允许步骤,所以如果你想每两个小时说一次&#34;,只需使用&#34; */2&#34;。

手册的说明(&#34;指定通过范围&#34;的数字值的跳过)有点模糊,并且每两个小时&#34;示例有点误导(这可能导致应用程序中的错误)

所以,有两个问题:

  1. unix cron程序如何使用&#34;步骤&#34;信息(斜杠后面的数字)来决定是否应该跳过一份工作? (模块划分?如果是这样,关于什么?决定&#34;真实&#34;运行的条件,以及哪些决定不是?或者是其他什么?)

  2. 是否可以配置unix cron作业来运行每个&#34; N&#34;分钟

2 个答案:

答案 0 :(得分:14)

  

步长值可与范围结合使用。以下范围   用&#34; <number>&#34;指定通过范围跳过数字的值。对于   例如,&#34; 0-23/2&#34;可以在hours字段中用于指定命令   每隔一小时执行一次(V7标准中的替代方案是   &#34; 0,2,4,6,8,10,12,14,16,18,20,22&#34)。之后也允许步骤   星号,所以如果你想每两个小时说一次&#34;,只需使用&#34; */2&#34;。

&#34;范围&#34;这里引用的是/之前给出的范围,它是特定字段的时间范围的子范围。第一个字段指定一小时内的分钟,因此*/...指定范围从0到59. */55的第一个字段指定所有分钟(在0-55范围内)是55的倍数 - 即每小时后0和55分钟。

同样,第二个(小时)字段中的0-23/2*/2指定所有小时数(在0-23范围内)是2的倍数。

如果您指定的范围不是0,则/后的数字(例如 N )指定每 Nth 分钟/小时/等从范围的下限开始。例如,第二个字段中的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没有&#34;每55分钟&#34;在超过一小时的时间范围内。

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

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

答案 1 :(得分:1)

应考虑使用另一个名为at的工具。可以使用它代替cron来实现主题启动器想要的功能。据我所知,它已预装在OS X中,但未与Debian(简称apt install at)之类的Linux发行版捆绑在一起。

它在一天的特定时间运行作业,并且可以使用复杂的规范来计算该时间。在我们的情况下,可以使用以下内容:

  

您还可以提供类似于现在的时间+计算时间单位,其中时间单位可以是分钟,小时,天或周,而您          可以告诉我们今天加班时间,今天开始工作,明天加班时间,明天开始工作。

脚本every2min.sh每2分钟执行一次。每次实例运行时都会延迟下一次执行:

#!/bin/sh
at -f ./every2min.sh now + 2 minutes
echo "$(date +'%F %T') running..." >> /tmp/every2min.log

哪个输出

2019-06-27 14:14:23 running...
2019-06-27 14:16:00 running...
2019-06-27 14:18:00 running...

由于at不知道“秒”单位,因此执行时间将在第一次运行后四舍五入为整分钟。但是对于给定的任务(范围为55分钟),这应该不是什么大问题。

可能还有安全方面的考虑

  

对于at和batch,都从标准输入或使用-f选项指定的文件中读取命令并执行。从调用之时起便会保留工作目录,环境(变量BASH_VERSINFO,DISPLAY,EUID,GROUP,SHELLOPTS,TERM,UID和_除外)和umask。

这是安排到目前为止我所看到的每隔X分钟运行一次的最简单的方法。