有时我需要以 Cron 能够提供的更复杂的方式运行计划作业。比如,安排作业每 23 分钟或 65 分钟运行一次。
在后一种情况下,可以通过添加多个 Cron 条目来运行同一行来解决。在第一种情况下,要添加的行数太多了。
三个明显的解决方案:
- 每分钟运行一次该过程;使用作业自身的逻辑来推断它应该何时实际运行并将其状态保存在某处(例如,在文件中)
- 在脚本中使用“sleep”暂停指定的时间,并使用 Supervisor 之类的工具保持其运行
- 使用任何能够以任意周期定期运行进程的实用程序(例如监控实用程序)并使用它启动任务
但在某些情况下它们都不方便。
是否有更智能的 Cron 替代品,至少适用于 POSIX 系统,能够使用任意时间表?
答案1
每 23 分钟运行一次作业,则以下操作不起作用:
*/23 * * * * /一些/命令
因为它将在 00:00、00:23 运行,然后 23 分钟后的 00:46 再次运行,然后在 01:00 再次运行,即 14 分钟后,而不是每 23 分钟运行一次。
原因/是*/23
不是数学“被除以”和不匹配 “只要分钟数(从什么时候开始?午夜?)是 23 的倍数”。
*/23
而是一个“增量”. 这告诉 cron 匹配每个第23项(/23
)来自分钟集0 1 2 3 4 5 6 7 8 9 10 11 ... 59
(其为*简写),即分钟0, 23 & 46
。
这种增量行为还允许您通过从 1 而不是 0 开始范围来改变偏移量:
1-59/23 * * * * /some/command
这项工作现在每小时运行一次,1分钟过去, 24分钟过去又四十七整点后的分钟数。
我同意你的评估,对于奇数时间表,cron 语法是不够的。
Cron 是一个非常简单的时间驱动调度程序。
我假设您可能希望每 23 分钟运行一次您的作业,因为这是您的批处理作业的运行时间总和以及增加的一点安全裕度?
您的选择是简化您的调度需求,使其能够与 cron 协同工作,即每 30 分钟运行一次您的作业,或者几乎完全放弃时间驱动调度的概念并研究事件驱动调度程序。
使用事件驱动的调度程序,一个批次的完成将触发下一个批次的自动启动,可以选择不延迟,并且不会产生使用基于时间的调度程序时产生的批次在前一个批次完成之前启动的风险。
维基百科提供了作业调度软件或工作负载自动化,许多供应商喜欢这样称呼他们的产品。
答案2
运行命令
crontab -e
然后输入
2
如果它要求你输入默认编辑器,则输入
*/23 * * * * <command here>
每 23 分钟运行一次作业。将 23 替换为您想要的任何数字。