gpt4 book ai didi

Cron 表达式每 N 分钟运行一次

转载 作者:行者123 更新时间:2023-12-04 18:05:32 29 4
gpt4 key购买 nike

我需要构建一个 cron 表达式,以便在用户单击开始按钮后每 10 分钟运行一次作业。

我正在尝试执行以下操作:

0 42/10 * * * ? *

而 42/10 就像用户点击开始于 hh:42(例如:18h42)。接下来的时间表是这样的:
1.  Friday, March 20, 2015 6:42 PM
2. Friday, March 20, 2015 6:52 PM
3. Friday, March 20, 2015 7:42 PM
4. Friday, March 20, 2015 7:52 PM
5. Friday, March 20, 2015 8:42 PM

问题是第二次执行后,作业等待一个小时才能执行下一次执行。如何构建一个立即启动并在 N 分钟后仍然运行的 cron 表达式?

预先感谢。

最佳答案

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

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

  • 后一种情况是通用情况,涵盖了 60 不能被 n 整除的情况。 .提到这个案例需要一个“开始时间”。通过一些简单的数学运算,您很快就会明白为什么会这样。

    n第 1 分钟(60 可被 n 整除)

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

    man 5 crontab: Step values can be used in conjunction with ranges. Following a range with /<number> specifies skips of the number's value through the range. For example, 0-23/2 can be used in the 'hours' field to specify command execution for every other hour (the alternative in the V7 standard is 0,2,4,6,8,10,12,14,16,18,20,22). Step values are also permitted after an asterisk, so if specifying a job to be run every two hours, you can use */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 .所以这里我们在 52 之间有 20 分钟的跳跃。 nd 和 12th分钟。

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

    n从分钟开始的第 1 分钟 YYYY-MM-DD HH:MM:00
    这种情况是通用的,涵盖了 60 的不可整除性。

    在这里它变得更有趣,需要采取不同的方法。当您从某一天有一个连续的计数器时,这可以解决。输入 UNIX 时间戳,自 1970-01-01 00:00:00 UTC 以来的总秒数.假设我们想从 McFly 到达 Riverdale 的那一刻开始:
    % date -d '2015-10-21 07:28:00' +%s 
    1445412480

    对于每个 7 运行的 cronjob在“2015-10-21 07:28:00”之后的第 1 分钟,crontab 将如下所示:
    # 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 && command2

    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 % modulo == 0))

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

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

    备注: cron没有亚秒级精度

    关于Cron 表达式每 N 分钟运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29176613/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com