每个>的cron表达式60分钟的工作

时间:2012-11-02 16:21:23

标签: cron

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

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

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

3 个答案:

答案 0 :(得分:0)

基本上,你需要每分钟运行你的cron:

* * * * *

让您的脚本确定其上次执行的日期是70或210分钟前 如果是这样,它将继续使用脚本的其余部分 如果没有,它会立即退出。

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

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

答案 1 :(得分:0)

每70分钟运行一次

* */1.1666

每210分钟运行一次

* */3.5

答案 2 :(得分:0)

此答案与thisthis

完全相同

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

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

后者涵盖了OP的案例,但为了保持通用性,我提出了两种情况。

n分钟(60可被n整除)

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

有效

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

  

man 5 crontab :步骤值可以结合使用   有范围。遵循/<number>指定的范围   跳过该范围内的数字值。例如,   可以在'hours'字段中使用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

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

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

n

开始每隔YYYY-MM-DDTHH:MM:00分钟

如果你想每隔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分钟运行一次
  • command2将从2015-10-21 07:00:00开始每隔70分钟运行一次。由于70可以被10整除,并且开始时间在小时内完美开始,我们可以将cron设置为每10分钟运行一次。
  • command3将从2015-10-21 07:00:00开始每隔210分钟运行一次。由于210可以被30整除,并且开始时间在小时内完美开始,我们可以将cron设置为每30分钟运行一次。

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

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

备注: cron没有亚秒级准确度