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

时间:2015-03-20 22:14:55

标签: cron

我需要构建一个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表达式?

提前感谢。

4 个答案:

答案 0 :(得分:3)

我认为你的格式错了。字段的顺序是:

  1. 分钟
  2. 小时
  3. 日期
  4. 星期几
  5. 命令
  6. 因此,在您的示例中,Minute为0,而您的Hour无效(Hour必须在0-23范围内)。我猜cron忽略了错误的Hour,并且每小时都在Minute 0上运行。

    但是,如果您确实希望每隔 N 分钟运行一次,则可以使用类似的格式(其中 N 小于60):

    0/N * * * * /bin/echo "Your Command Here"
    

    但是,请记住/N在当前小时内每 N 分钟重复一次命令。因此,如果您的crontab中有0/33,则命令将在以下位置运行:

    • 00:00
    • 零点33
    • 1时00
    • 1时33分

    不在:

    • 00:00
    • 零点33
    • 01:06
    • 1时39分

答案 1 :(得分:1)

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

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

由于一个月内的天数,这两种情况完全不同。

后一种情况涵盖了60不能被n整除的情况,并且通过简单的数学运算,您很快就会发现需要一个起点。

n分钟(60可被n整除)

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

  

man 5 crontab :步骤值可与范围结合使用。在/<number>的范围之后指定了跳过   数字在整个范围内的值。例如,可以使用0-23/2   在&#39;小时&#39;字段,指定每隔一小时执行一次命令   (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

此处,从{m>到第59分钟,每隔n分钟执行command1

这意味着:

  • 如果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上运行。所以我们在5212th分钟之间跳了20分钟。

注意:你清楚地看到,如果n没有完美地划分60,你就会遇到问题。例如。 m=0,n=110,11,22,33,44,55上运行,因此我们只有5分钟到下一次运行。

n

分钟开始每隔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

对于在2015-10-21 07:28:00&#39;之后每隔7分钟运行一次cronjob,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没有亚秒级准确度

答案 2 :(得分:0)

您无法根据用户输入或触发器创建cron表达式。

更好的解决方案是使用布尔标志启用或禁用cron,即在用户启动触发器时启用cron服务方法,如下所示:

public static boolean cronEnabled = false;

public cronServiceMethod(){
  if(cronEnabled){
     // Keep your logic here
  }
}

// Call this method when user clicks the Start button
public enableCron(){
  cronEnabled = true;
}

public disableCron(){
  cronEnabled = false;
}

就cron而言,让它每10分钟运行一次,如下所示:

0 0/10 * * * ?

答案 3 :(得分:0)

我发现了这个link,真的很好:我们几乎可以在所有可能的调度选项中获得玉米表达:

enter image description here

请参考上面的示例屏幕快照,其真实的视觉控制和自我说明用于生成任何cron表达式。