间隔 cron 什么时候第一次执行?(例如:*/3 天)

Shr*_*ut1 13 cron scheduling

tl;dr:cron 是否使用间隔的数值与当天的数值进行比较来确定其执行时间,还是在创建后的规定时间“每 3 天”一次?

题:

如果我添加以下作业,crontab -e它会在明天午夜首次运行还是从明天开始运行三天?还是仅在每月的“第三”天?第 1、4、7、10 天……?

0 0 */3 * * /home/user/script.sh

我昨天把这个 cron 放进去,今天早上它运行了(这可能是我问题的答案),但我想验证这是否正确。今天是第 31 天,该间隔值似乎确实属于该序列。如果 cron 在本月 1 号开始执行一个间隔,它明天会为我再次运行吗?

补充说明:

已经有一些关于cron的优秀文章和资源一般(这是一个共同的话题,我知道),但是,对于一个特定的时间间隔的出发点是不一样清楚给我。多个来源以多种方式表达它:

  • 这个unixgeeks.org帖子指出:

    Cron 还支持 'step' 值。dom 字段中的值 */2 表示命令每两天运行一次,同样,小时字段中的 */5 表示命令每 5 小时运行一次。

    • 那么,每两天真正隐含的什么?
  • 这个答案指出,cronjob of0 0 */2 * *将在“每个奇数日的 00:00 执行(步骤 2 的默认范围,即 1,3,5,7,...,31)”

    • cron 总是从一个月的第一天开始吗?
    • 由于间隔基于当天的数值,该博客似乎指出 cron 将在 31 日执行,然后在下个月的 1 日再次执行(因此连续两天)。
  • 这篇博文中的另一个例子

    • 0 1 1 */2 * command to be executed 应该在每月的第一天执行,每两个月的凌晨 1 点
    • 这是否意味着 cron 将执行第 1、3、5、7、9、11 个月?

看来 cron 旨在*/3根据与天(或秒、分、小时、月)的数值相比的间隔数值来执行间隔 cronjobs ( )。这是 100% 正确的吗?

PS这是关于 cron 的一个特定功能的一个非常具体的问题,(我相信)需要一些澄清。这应该让 Google 可以 100% 确定地告诉您,您的“每 3 个月”cron 将在添加到 crontab 后首次运行。

Art*_*ild 7

crontab中(5)手册页使用的措辞,这是非常明确的:

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

确切的措辞(和示例)是“跳过该范围内的数字值”-暗示它从该范围中的第一个数字开始。

这意味着如果范围1-31为天,值的情况下返回1-31/2或者*/2是1,3,5,7 ...等等。这也意味着,范围重置为初始值时,它已经运行通过。

因此,在这种情况下,cronjob 将在下个月的 31 日和 1 日运行,这也是正确的。

请注意,cron 有 2 个相互排斥的字段 - “月中的某天”和“周中的某天”。因此,当运行间隔几天的作业时,您必须选择其中之一。

如果你想定义一个每隔一天完美运行的 cronjob,你必须使用多行并根据当前日历自定义每个月。

  • 对于严格的每日间隔,每月使用不同的 crontab 行(并在闰年中享受无穷乐趣)的替代方法是每天运行,让脚本检查并自行退出。使用`date '+%s'` 获取自纪元以来的秒数,除以 86400,然后使用模数(也可能是偏移量)来选择您的日期。 (8认同)

Pau*_*ant 6

今天(2020-07-31)是问这个问题的最佳日子,因为30有很多因素。

我的理解(根据记忆)是 (a) * 扩展到 1-31 的范围,然后 (b) /3 是该列表的跳过增量。因此,如果您编写 3-31/3,它将在 3 日、6 日、9 日、..、27 日(2 月)或 30 日(其他月份)运行。man -s 5 crontab 用范围暗示了这一点,但不包括除基值以外的示例。

我为每个跳过值设置了一个 crontab(Linux Mint 18.1):

30 13 */1 * * date > /home/paul/cron.1.log
30 13 */2 * * date > /home/paul/cron.2.log
30 13 */3 * * date > /home/paul/cron.3.log
...
30 13 */30 * * date > /home/paul/cron.30.log
30 13 */31 * * date > /home/paul/cron.31.log
Run Code Online (Sandbox Code Playgroud)

它只在跳跃为 1、2、3、5、6、10、15 和 30 的地方运行。这看起来像 (31 - 1) 的所有因子。

然后我将每个范围更改为 7-31/,并在跳跃为 1、2、3、4、6、8、12 和 24 时触发。这就是 (31 - 7) 的所有因数。

对于范围 8-31,只跳过 1 和 23 火,因为 (31 - 8) 是素数。