开发者工具 · Crontab 生成器
重叠的 cron 作业:为什么长任务需要集群以及如何添加它
· 为什么它很重要
计划任务 并发 操作
Cron 会按计划启动作业,无论上一次运行是否已完成。这篇文章解释了为什么这会导致损坏和负载峰值,并展示了使运行独占的羊群习惯用法。
两个导入写入同一个表 - 每小时作业慢于一个小时,并且 cron 不断启动新副本
每小时表达式可以在与较早候选者相关的工作仍在运行时识别新候选者。 `0 * * * *` 中没有任何内容记录持续时间、进程标识或完成状态。 ToolAcre 每小时扩展零分钟,并可以列出未来时间,但它从不观察这些时间之间的操作。
这意味着必须单独审查频率和排他性。如果任务可以超过其间隔,请首先量化目标系统上的持续时间。然后选择那里支持的并发控制。编辑正确的计划本身并不能增加现有流程的知识或阻止第二次调用。
表达式不包含正在运行的作业状态
解析器在调用之间是无状态的。它将文本转换为排序值数组和警告,而 `nextRuns` 在没有进程表的情况下搜索日期。 UI 根据当前表达式重新计算,并且不保留作业生命周期。它的模型询问先前的动作何时保持活跃,而不是询问是否保持活跃。
这是文章标题背后的精确证据。它不需要关于每个 cron 守护进程如何分叉或排队的声明。表达式语言本身缺少重叠字段,并且生成器缺少运行时监视器。任何排他性保证都必须来自一个单独的层,其行为经过独立测试。
可能的重叠症状取决于命令,并且生成器无法预测
重叠可能与重复工作、锁争用或负载相关,但这些结果取决于命令的作用。即使在相同的小时计划下,只读幂等检查和有状态导入也具有不同的风险。 ToolAcre 没有命令解析器、数据库连接或资源模型来预测它们。
记录操作的并发属性,而不是将通用故障预测附加到表达式。测量正常和最差观察到的持续时间,识别共享状态并确定跳过或延迟运行的含义。这些运营事实决定了排他性是否必要;这五个字段仅确定候选时间。
羊群语法和行为在此存储库之外
工作簿规定了 `flock -n`、锁定路径和退出行为。此存储库中没有出现集群实现或测试,因此此模块不验证该语法。平台可用性、文件系统权限和锁定生命周期都位于浏览器的调度代码之外。
如果集群适用于目标,请使用其安装的文档并在那里测试无害的争用场景。不要因为前缀计时字段通过 ToolAcre 就推断成功。有效的表达式可以位于无效的锁定命令之前,就像正确的锁定可以保护为另一种方言编写的调度一样。
工作边界:验证每小时计时而不声明锁定语义
使用 `0 * * * *` 作为工作时间表。描述说每小时过零分,预览应该在开始时刻之后前进到连续的小时边界。这证明了 ToolAcre 计算的节奏。它并不能证明当命令的持续时间跨越这些边界之一时会发生什么。
将每小时的期望带入目标端并发测试。启动一个无害的长时间运行实例,到达下一个候选实例并观察所选的控制。将结果作为执行证据与表达式审查分开。如果计时或锁定稍后发生变化,这可以保留清晰的诊断。
替代排他性机制需要特定目标的证据
脚本内部的锁、监管策略和服务管理器行为都可能提供排他性,但无法从此源对它们的语义进行排序。 ToolAcre 也不知道错过一次运行是否可以接受,工作是否应该排队,或者是否应该退出第二次尝试。
在选择机制之前定义这些结果。 “绝不重叠”只是一项政策;其他还有合并、排队和与分区状态的并行性。生成器可以提供政策讨论中使用的候选节奏,而实现选择仍然基于实际运行时间。
分布式锁定仍处于计划解析和预览之外
跨主机共享的锁引入了本地日历计算之外的协调。解析器中不会出现主机身份、网络存储或租约。因此,本文避免建议本地文件或浏览器预览解决分布式并发问题。
对于多主机工作,请使用协调设计,其故障模式、所有权和恢复行为均已记录和测试。将五场时间表保留为该系统的一项输入。表达式可以完美地移植,而排他性层则与环境密切相关。
要点:日程安排和排他性是不同的问题——生成器处理第一个问题,flock 处理第二个问题
当另一次尝试符合条件时安排答案;排他性回答了是否可以开始。 ToolAcre通过字段扩展和挂钟预览仅实现了前者。它缺乏进程状态是一个架构边界,而不是一个隐藏的默认设置。
构建并验证节奏,测量操作持续时间,然后测试目标支持的并发策略。将这些作为单独的控件进行报告可以使两者都可以进行审查。生成器不会调度作业,并且复制的表达式永远不应该被描述为防止重叠执行。