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

pla*_*oom 5 cron

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

我正在尝试做类似的事情:

0 42/10 * * * ? *
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

预先感谢。

kva*_*our 10

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

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

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

nth 分钟(60 可被 整除n

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

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
Run Code Online (Sandbox Code Playgroud)

在这里,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。所以这里我们在52nd 和12th分钟之间有 20 分钟的跳跃。

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

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
Run Code Online (Sandbox Code Playgroud)

对于7在“2015-10-21 07:28:00”之后每分钟运行一次的 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
Run Code Online (Sandbox Code Playgroud)

mintestcmd定义为

# 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
Run Code Online (Sandbox Code Playgroud)

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

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

备注: cron没有亚秒级精度


lso*_*wen 7

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

  1. 分钟
  2. 小时
  3. 每月的某一天
  4. 星期几
  5. 命令

所以在你的例子中,Minute是 0,你Hour是无效的(Hour必须在范围内0-23)。我猜 cron 忽略了不正确的Hour, 并且Minute 0每小时运行一次。

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

0/N * * * * /bin/echo "Your Command Here"
Run Code Online (Sandbox Code Playgroud)

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

  • 00:00
  • 00:33
  • 01:00
  • 01:33

不在:

  • 00:00
  • 00:33
  • 01:06
  • 01:39