在Crontab中通用的方式来指定每个n分钟,其中n> 60

crontab中,我已经看到了一些用户请求每5分钟运行一次的答案:

*/5 * * * * command 

或每隔5分钟抵消一次:

 10-59/5 * * * * command 

我已经看到一些创造性的解决scheme,人们每90分钟就做一次2行crontabs:

 0 0-21/3 * * * whatever 30 1-22/3 * * * whatever 

感谢下面的答案之一(谢谢@khaled),这里是另一个创造性的解决scheme3小时30分钟:

 0 0-23/7 * * * whatever 30 3-23/7 * * * whatever 

是否有一个通用的解决scheme,每x分钟的问题? 例如,我目前需要每3小时30分钟。

为了解决重复的标签:链接的问题显然是不同的 – 关于如何设置和debuggingcron作业有一般性的build议。 我指的是一个特定的问题,我们正在达到cron语法的限制。 我正在寻找一个解决“大于60分钟”问题的通用algorithm,这个问题在相关问题中没有解决。

你只需要自己做math来提出所需的工作,以达到你的时间。

 0 0-23/7 * * * whatever 30 3-23/7 * * * whatever 

从这两个例子可以得出一个简单的algorithm(当有30分钟偏移时):

  • 添加两个条目:一个0分钟的偏移量和另一个30分钟的偏移量。
  • 指定小时数范围宽度等于duration * 2
  • 指定小时偏移:一个从0开始,另一个从持续30分钟后丢弃持续时间开始。

如果你想得更多,你可以提出类似的解决scheme,例如每75分钟一次。

编辑:

Cron不能用于所有types的计划任务。 例如,在每月的最后一天每月执行一次工作。 你不能简单地用cron来做,因为月份的最后一天是从一个月到另一个月。 为了解决这个问题,你可以在每个月的最后一天(28-31)的可能值范围内运行一个cron作业,并且在做实际的工作之前确认它确实是脚本中的最后一天。

在这种情况下,我认为你只是试图用cron去做一些本身无法做到的事情(当然除了定期执行一个helper脚本的解决scheme,在这种情况下,我认为它不是cron自己解决问题)。

3小时30分钟的解决scheme并不完全正确。 这是给定的解决scheme:

 0 0-23/7 * * * whatever 30 3-23/7 * * * whatever 

这个错误的原因是因为cron会在21:00和00:00时间运行这个作业,间隔时间是3小时,而不是3小时30分钟。

所有时间间隔的一般解决scheme必须能够处理不能平均分为24小时的情况。 虽然它不是均匀分成24小时,但它平均分为一个星期! 最简单的方法就是做两个“每7小时”的重叠组,如下所示:

 0 0-23/7 * * 1 whatever 0 4-23/7 * * 2 whatever 0 1-23/7 * * 3 whatever 0 5-23/7 * * 4 whatever 0 2-23/7 * * 5 whatever 0 6-23/7 * * 6 whatever 0 3-23/7 * * 7 whatever 30 3-23/7 * * 1 whatever 30 0-23/7 * * 2 whatever 30 4-23/7 * * 3 whatever 30 1-23/7 * * 4 whatever 30 5-23/7 * * 5 whatever 30 2-23/7 * * 6 whatever 30 6-23/7 * * 7 whatever 

一个星期可以分割的东西是你能做的最好的,因为几个月不能完全排列,这是唯一可行的方法。 例如,精确地每12分钟的时间间隔在一行crontab中是微不足道的,但是精确地每11分钟的间隔是不可能的,因为10080不能被11整除(10080是一周中的分钟数)。

如果可能的话,写一个algorithm来解决这个问题是绝对有可能的,但是显然不值得,特别是考虑这些解决scheme实际上是什么样的。

把命令的结果

 date +%s 

在你的crontab中的一个variables。 像TIME = 1497950105。 现在在你的crontab中你需要一个类似的条目

 * * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && TIME=$(date +\%s) && whatever' 

秒数是你想要的秒数(你的情况是12600)。

或者如果您想在计划完成后等待3小时30分钟

 * * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && whatever && TIME=$(date +\%s)' 

编辑:我纠正了我的prevoius答案:

  • 你必须用\转义%符号,所以%s变成\%s
  • 你必须在命令前加上/ bin / bash -c

另一个解决scheme(不使用TIME)是:

  * * * * * /bin/bash -c '[[ $((($(date +\%s) / 60) % minutes)) -eq 0 ]] && whatever' 

在你的情况下,分钟是210。

编辑2:

正如MSalters所build议的那样,最好每隔N分钟运行一次,其中N是在60分钟和你的时间间隔之间的最大公约数,以分钟为单位