【问题标题】:cron expression for every > 60 minutes job每 > 60 分钟作业的 cron 表达式
【发布时间】:2012-10-23 08:19:34
【问题描述】:

有没有办法将 cron 表达式设计为每 70 分钟或 210 分钟运行一次,即 > 60 分钟。我试图搜索这个,但找不到这个。

我最终使用了一个包装脚本,该脚本将执行每 5 分钟(或最佳重复时间)调用一次所需的时间检查。

如何在 cron 表达式中完成这样的任务?

【问题讨论】:

标签: cron


【解决方案1】:

每 70 分钟运行一次

* */1.1666

每 210 分钟运行一次

* */3.5

【讨论】:

    【解决方案2】:

    基本上,您需要每分钟运行一次 cron:

    * * * * *
    

    并让您的脚本确定其最后一次执行日期是在 70 分钟还是 210 分钟前。
    如果是这样,它将继续执行脚本的其余部分。
    如果没有,它会立即退出。

    换句话说,不要尝试将所有内容都放在 cron 表达式中。

    正如Keith Thompson 所评论的那样,您可以减少运行该脚本的频率 (0 0/5 0 ? * * *),在 70 分钟进行一次测试,或每 30 分钟 (0 0/30 0 ? * * *) 进行一次测试210 分钟。

    【讨论】:

    • 不,它将在每小时后的 0 分钟和 35 分钟运行。
    • @KeithThompson 对。固定。
    • 这是一种方法,但在 70 分钟的间隔内,cron 作业只能每 10 分钟执行一次,在 210 分钟内它可以每 30 分钟运行一次。
    【解决方案3】:

    此答案与thisthis 完全相同

    如果您想每n 分钟运行一次 cron,有两种情况需要考虑:

    • nth 分钟(60 可被n 整除)
    • YYYY-MM-DD HH:MM:00 开始的每nth 分钟(通用)

    后者涵盖了 OP 的情况,但为了保持通用性,我将介​​绍这两种情况。

    nth 分钟(60 可被n 整除)

    这对 (n=1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30) 有效

    为此,我们使用定义范围和步长值的组合:

    man 5 crontab: 步长值可以结合使用 与范围。在带有/<number> 的范围之后指定 在范围内跳过数字的值。例如, 0-23/2 可用于“小时”字段中指定命令 每隔一小时执行一次(V7 中的替代方案 标准是0,2,4,6,8,10,12,14,16,18,20,22)。步长值为 也允许在星号之后,因此如果指定要执行的作业 每两小时运行一次,您可以使用*/2

    请看下面的例子:

    # Example of job definition:
    # .----------------- minute (0 - 59)
    # |   .------------- hour (0 - 23)
    # |   |  .---------- day of month (1 - 31)
    # |   |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |   |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |   |  |  |  |
    # *   *  *  *  *   command to be executed
      m/n *  *  *  *   command1
    

    这里,command1 将从 m 到 59 每隔 n 分钟执行一次。

    这意味着:

    • 如果m<=n,它们将始终间隔n 分钟。 例如。 m=2,n=10 :: 作业将在几分钟内运行 2,12,22,32,42,52
    • 如果m>n,它们将始终以n 分钟间隔,除非在 小时的开始。 例如。 m=12,n=10 :: 作业将在几分钟内运行 12,22,32,42,52。所以这里我们之间有 20 分钟的跳跃 52nd 和 12th 分钟。

    注意:你清楚地看到如果n 不除60 完美,你会有问题。例如。 m=0,n=11 继续运行 0,11,22,33,44,55,所以我们距离下一次运行只有 5 分钟。

    YYYY-MM-DDTHH:MM:00开始的每nth分钟

    如果你想每n 分钟运行一次 cron,你不能用 cron 干净地做到这一点,但这是可能的。为此,您需要在测试检查时间的 cron 中进行测试。这最好在查看 UNIX 时间戳时完成,即自 1970-01-01 00:00:00 UTC 以来的总秒数。假设我们想从 McFly 到达 Riverdale 的那一刻开始:

    % date -u -d '2015-10-21 07:28:00' +%s 
    1445412480
    
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
      *  *  *  *  *   mintestcmd "2015-10-21 07:28:00"   7 && command1
    */10 *  *  *  *   mintestcmd "2015-10-21 07:00:00"  70 && command2
    */30 *  *  *  *   mintestcmd "2015-10-21 07:00:00" 210 && command3
    

    mintestcmd 定义为

    #!/usr/bin/env bash
    starttime=$(date -d "$1" "+%s")
    # return UTC time
    now=$(date "+%s")
    # get the amount of minutes
    delta=$(( (now - starttime) / 60 ))
    # set the modulo
    modulo=$2
    # do the test
    (( delta >= 0 )) && (( delta % modulo == 0))
    

    在上面的例子中我们有:

    • command1 将在 2015-10-21 07:28:002015-10-21 07:35:002015-10-21 07:42:002015-10-21 07:49:00、...上每 7 分钟运行一次
    • 2015-10-21 07:00:00 开始,command2 将每 70 分钟运行一次。由于 70 可以被 10 整除,并且开始时间完美地从整点开始,我们可以将 cron 设置为每 10 分钟运行一次。
    • 2015-10-21 07:00:00 开始,command3 将每 210 分钟运行一次。由于 210 可以被 30 整除,并且开始时间完美地从整点开始,我们可以将 cron 设置为每 30 分钟运行一次。

    备注: UNIX 时间以 UTC 表示。如果您的 cron 在 受夏令时影响的不同时区 时间,建议不要在2到3之间运行命令 点。这可以跳过命令或运行命令 两次(取决于时间是向前跳还是向后跳)

    备注:UNIX时间不受闰秒影响

    备注:cron没有亚秒级精度

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 2012-11-02
      • 2018-06-04
      • 1970-01-01
      • 2021-09-03
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多