【问题标题】:Run a cron job every X minutes, where X is e.g. 50 [duplicate]每 X 分钟运行一次 cron 作业,其中 X 是例如50 [重复]
【发布时间】:2021-03-09 05:32:59
【问题描述】:

我需要一个 cron 来每 50 分钟运行一次我的任务,从现在开始。

假设现在是 12:10。

所以我的任务必须在13:00, 13:50, 14:40, 15:30, 16:20, 17:10, 18:00, ...运行

我尝试了各种crontab 表达式,但都不起作用;

  • */50 * * * * 运行时间为 12:50、13:40、....
  • */50 13/1 * * * 运行时间为 13:00、13:50、14:00、....
  • 0,50,40,30,20,10/50 * * * * 运行时间为 12:20, 12:30, 12:40, ....

知道我该如何表达吗?

【问题讨论】:

  • 不,我之前读过这个问题,它与我的问题不同。
  • 我回滚了你的编辑,因为它只会引起混乱,而你没有提供任何澄清。希望标题现在也更清楚了。
  • 看看this的答案。

标签: cron


【解决方案1】:

不,Vixie cron 中没有任何符号可以在不是偶数倍的时间间隔安排某些事情。你必须求助于 Vixie cron 之前的标准做法(无论如何这只是 Linux 上的标准),这只是为了枚举时间。

 0  0,5,10,15,20 * * * yourjob
50  0,5,10,15,20 * * * yourjob
40  1,6,11,16,21 * * * yourjob
30  2,7,12,17,22 * * * yourjob
20  3,8,13,18,23 * * * yourjob
10  4,9,14,19    * * * yourjob

为简单起见,这缩短了午夜前的最后一个时间间隔 - 仅 40 分钟而不是 50 分钟 - 以避免不得不拼出更复杂的时间表。

或者,您可以在午夜之前运行一个 cron 作业,将 at 作业安排在接下来的 24 小时内。

59 23 * * *    yourschedule

yourschedule 可能类似于

#!/bin/bash
for ((i=0; i<60*24; i+=50)); do
    echo yourjob | at $((i/60)):$((i%60))
done

或者使用自调度的at 作业,它将在 50 分钟后永远“植入”下一次运行:

#!/bin/bash
echo "$0" | at "+50 minutes"
# ... your original yourjob script here ...

(不确定您的 at 是否支持该时间指示器;请参阅其 man 页面和/或实验。atq 显示您已排队的作业,atrm 可让您删除作业。)

在某些情况下,每 10 分钟运行一次 yourjob 可能更容易,如果距离上次运行不到 45 分钟,则立即中止它。 (然后你必须让它跟踪它的运行时间,但它不必非常参与 - 可能会触摸一个标志文件,因此它的更改日期表示上次运行。

#!/bin/bash
if (($(date +%s) - $(stat -c '%Y' .lastrun.50min) < 45*60)); then
    exit 0
fi
touch .lastrun.50min
# ... Your original yourjob script here

stat -c '%Y' 是 GNU/Linux;对于其他平台,语法会略有不同。)

在 Paul Vixie 的 cron 实现被 Linux 采用并流行起来之前,crontab 通常不允许像 */5 这样的周期符号。那时候,你总是需要拼出时间,比如5,10,15,20,...

【讨论】:

  • 感谢您的回答。在您的两个解决方案中,您都需要跟踪,而我不能。 (在第一个解决方案中,您需要跟踪以在接下来的 24 小时内获得首次运行时间)
  • 我不明白你的评论。跟踪什么?第一个时间表将立即开始运行;下一次运行将在 50 分钟内发生。如果你想在下一个偶数分钟,显然要重新计算分钟以适应它。然后,如果您在 01:23:59 运行 crontab 并且时钟在 crontab 完成安装计划之前超过 01:24:00,那么您也可能会错过“现在”运行。
  • 假设您将任务安排为 24 小时,最后运行时间是 23:20,那么您想在 23:59 安排下一个 24 小时,因此您的计划必须从 00:10 开始: 00 ,第二天您的日程安排必须从 00:20:00 开始。所以你需要存储一天中的最后一次运行时间,以决定“第二天的首次运行时间是什么?”
  • 然后进行自调度at 作业(第三个示例)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2016-10-18
  • 2013-11-27
  • 1970-01-01
  • 2014-12-01
  • 2019-11-10
  • 2023-03-04
相关资源
最近更新 更多