Unix “如何使用Cron”;步骤;工作

Unix “如何使用Cron”;步骤;工作,unix,cron,Unix,Cron,我遇到了这样一种情况:我以为每55分钟运行一次的cron作业实际上是在小时后55分钟运行的,而是在小时的顶端运行的。实际上,这不是一个cron作业,而是一个使用cron语法的作业 当我要求这个应用程序每55分钟安排一次作业时,它会创建一个crontab行,如下所示 */55 * * * * 此crontab行以结束,而不是每55分钟运行一次作业。相反,作业在工作时间后55分钟运行,并在工作时间的最高峰运行。我不希望这样。我已经运行了一个,它验证了不希望出现的行为是正确的cron行为 这导致我查

我遇到了这样一种情况:我以为每55分钟运行一次的cron作业实际上是在小时后55分钟运行的,而是在小时的顶端运行的。实际上,这不是一个cron作业,而是一个使用cron语法的作业

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

*/55 * * * *
此crontab行以结束,而不是每55分钟运行一次作业。相反,作业在工作时间后55分钟运行,并在工作时间的最高峰运行。我不希望这样。我已经运行了一个,它验证了不希望出现的行为是正确的cron行为

这导致我查找
/
的实际含义。当我看这本书时,我了解到斜线表示“步骤”,但手册本身在这方面有点模糊

阶跃值可与范围一起使用。在带有“
”的范围之后,指定数字值在该范围内的跳过。例如,“
0-23/2
”可在“小时”字段中用于指定每隔一小时执行一次命令(V7标准中的备选方案是“
0,2,4,6,8,10,12,14,16,18,20,22”
)。在星号后面还允许执行步骤,因此如果您想说“每两小时”,只需使用“
*/2

手册的描述(“指定数字值在整个范围内的跳跃”)有点模糊,“每两小时”的示例有点误导(这可能是导致应用程序中出现错误的原因)

因此,有两个问题:

  • unix cron程序如何使用“步骤”信息(斜杠后的数字)来决定是否应跳过运行作业?(模块划分?如果是,基于什么?哪些条件决定“真实”运行,哪些条件决定不运行?或者是其他原因?)

  • 是否可以将unix cron作业配置为每“N”分钟运行一次

  • 阶跃值可与范围一起使用。跟随一系列 使用“
    ”指定数字值在整个范围内的跳过。对于 例如,“
    0-23/2
    ”可在小时字段中用于指定命令 每隔一小时执行一次(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)指定从范围下限开始的每N分钟/小时/etc一次。例如,第二个字段中的
    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,所有条目都在指定时间运行相同的命令。

    应该考虑另一个名为
    at
    的工具。可以使用它代替cron来实现主题初学者想要的内容。据我记忆所及,它是预装在OSX中的,但并没有与Debian等Linux发行版捆绑在一起(只需
    apt install at

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

    您还可以给出时间,如now+count time units,其中时间单位可以是分钟、小时、天或周,您可以 可以告诉at,用今天的时间来安排今天的工作,用明天的时间来安排明天的工作

    脚本
    每2分钟执行一次。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、GROUPS、SHELLOPTS、TERM、UID和u除外)和umask从调用时就保留了下来

    这是我见过的最简单的安排每X分钟运行一次的方法