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