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

用于每个的cron表达式>;60分钟的工作,cron,Cron,有没有办法将cron表达式设计为每70分钟或210分钟运行一次,即>60分钟。我试图搜索这个,但没能找到 最后,我使用了一个包装器脚本,它将执行所需的时间检查,每5分钟调用一次(或最佳循环时间) 如何在cron expression中完成这样的任务?基本上,您需要每分钟运行一次cron: * * * * * 并让您的脚本确定其最后一次执行日期是70分钟前还是210分钟前。 如果是,它将继续执行脚本的其余部分。 如果没有,它将立即退出 换句话说,不要尝试将所有内容都放在cron表达式中 正如所评

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

最后,我使用了一个包装器脚本,它将执行所需的时间检查,每5分钟调用一次(或最佳循环时间)


如何在cron expression中完成这样的任务?

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

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

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

正如所评论的,您可以不太频繁地运行该脚本(0 0/50?***),测试时间为70分钟,或者每30分钟(
0 0/30 0?***
)运行一次测试时间为210分钟。

每70分钟运行一次

* */1.1666

每210分钟跑一次

* */3.5

这个答案与和完全相同

如果你想运行一个CRON,每一个代码< n>代码>分钟,有两个案例需要考虑:

  • n
    th分钟(60可被
    n
    整除)
  • n
    yyyyy-MM-DD HH:MM:00开始的第h分钟(通用)
后者涵盖了OP的案例,但为了保持通用性,我介绍了这两个案例

n
th分钟(60可被
n
整除) 这适用于(
n=1、2、3、4、5、6、10、12、15、20、30

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

man 5 crontab
阶跃值可以结合使用 有射程。在带有
/
的范围之后指定 在整个范围内跳过数字的值。例如
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分钟执行一次

这意味着:

  • 如果
    mn
    ,则它们将始终间隔
    n
    分钟,但在 一小时的开始。 例如,m=12,n=10作业将在几分钟内运行
    12,22,32,42,52
    。这里我们有一个20分钟的跳跃 第52分钟和第12分钟
注意:您可以清楚地看到如果
n
不除以60 很好,你会有问题的。例如,
m=0,n=11
0,11,22,33,44,55
,因此我们只有5分钟的时间进行下一次跑步

从YYYY-MM-DDTHH:MM:00开始的每
n
th分钟 如果您想每隔
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
开始时间=$(日期-d“$1”+%s)
#返回UTC时间
现在=$(日期“+%s”)
#获取分钟数
增量=$((现在-开始时间)/60))
#设模
模=2美元
#做测试
((增量>=0))&(((增量%模==0))
在上述示例中,我们有:

  • command1
    将在
    2015-10-21 07:28:00
    2015-10-21 07:35:00
    2015-10-21 07:42:00
    2015-10-21 07:49:00
  • 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
没有亚秒精度

好吧,让它在设定的小时数后运行是可能的,但大约70分钟?我不这么认为。你可以在
上使用
。可能的重复使用一个表达式是无法做到的;有些变通方法使用多个表达式(请参阅)。我已升级我的答案以包含Keith的评论。不,这将在每小时后0到35分钟运行。@KeithThompson是的。修正了。这是一种方法,但在70分钟的时间间隔内,cron作业只能每10分钟执行一次,在210分钟内,它可以每30分钟运行一次。