简体中文

开发者工具 · Crontab 生成器

cron 中的一个月中的某一天与一周中的某一天:令所有人惊讶的 OR 规则

· 工作原理

计划任务 日历 调度

两个日历过滤器通过“或”门连接到一个计划中
原始 ToolAcre 矢量图

当两个日期字段都受到限制时,如果其中一个字段匹配,则 cron 会运行该作业。这篇文章解释了 crontab(5) 的规则、它存在的原因以及如何获取它阻止的计划。

该报告于 1 日和每周一发布 — 表达式 0 9 1 * 1 并不意味着它看起来的样子

诸如 `0 9 1 * 1` 之类的表达式看起来像“09:00 on the first Monday”。 ToolAcre 并不是这样解读的。将月份中的某一天设置为 1 并将星期几设置为星期一时,解析器会警告任一条件都可以匹配,因此计划包括每个第一个和每个星期一。

这不是一个次要的措辞偏好。月度报告可以额外运行四到五次,预计仅在星期一进行的操作也可以在每月的第一天运行。生成器在描述旁边放置了一个“值得检查”警告,以便在将表达式复制到外部 crontab 之前扩展的行为是可见的。

所写规则 — 如果月份中的某一天和星期几都受到限制,则当任一字段匹配时运行该命令

实现的 `dayMatches` 函数显式处理四种情况。两个通配符接受每个日期;通配符月份日期推迟到工作日;通配符工作日遵循月份中的某一天;两个受限字段返回其匹配项的逻辑或。测试涵盖仅与第 13 日、仅与星期五匹配的日期,以及与这两个条件都不匹配的日期。

描述保留相同的规则。 `0 0 13 * 5` 呈现为“on the 13th of the Month or on Friday”,而不是一个含糊的连词。解析、下次运行选择和英语输出都使用相同的解释。这种共同的行为比孤立的帮助标签是更有力的证据,因为这些路径之间的分歧会立即产生误导性的预览。

解析器实现 OR 并公开结果;它没有建立规则的历史

工作簿大纲提供了 OR 设计的历史原因,但此存储库证明了行为而不是出处。代码注释标识 Vixie 风格的规则,测试建立由 ToolAcre 建模的结果。他们没有记录谁选择了该规则、该规则何时被采用或者为什么倾向于宽容的解释。

在技术写作中保持该边界很重要。读者需要确切地知道这个工具是如何扩展表达式的;他们不需要发明标准叙述来安全地使用它。如果部署目标记录了不同日期的语义,则其自己的手册的排名优于此浏览器预览。 ToolAcre 声明了它计算的方言,而不是声称每个调度程序都同意。

工作示例:枚举 0 9 1 * 1 一个月 - 与作者想要的时间表相比,它触发的天数

考虑第一天不是星期一的一个月。 `0 9 1 * 1` 在第一次运行时生成一次运行,并在每周一生成附加运行。如果第一个本身是星期一,则该日期仍会出现一次,因为下次运行搜索考虑一个日历分钟,而不是两个单独的触发器。并集的大小随日历而变化,但逻辑上不变。

您可以通过选择时区并读取接下来的五次运行来检查该联合。预览严格在当前时刻之后开始,并搜索日历日期,应用月、日和时间字段。它不承诺文章散文中的特定月份,因为实时列表取决于读者执行检查的时间和地点。

AND 风格的第一个星期一命令解决方法不在该计划生成器之外

该计划建议嵌入 shell 日期测试以获得 AND 行为。 ToolAcre 无法验证此类命令:它仅接受五个计划字段,并且其复制的整行包含占位符可执行文件。 Shell 语法、百分比转义、命令可用性和退出行为都属于最终运行作业的环境。

在此生成器中,安全的设计举措是将一天字段保留为 `*` ,除非真正打算使用 OR 并集。对于第一个星期一的要求,记录五字段 cron 单独不能表达此方言中的交集。单独选择并测试特定于环境的解决方案,而不是按保证提供未执行的代码片段。

此五字段解析器不解释其他调度程序运算符

某些调度程序语法公开诸如 `#`、`L`、`W` 或 `?` 之类的运算符,但此解析器不接受其中任何一个。它还拒绝六个字段,并解释说它的合同是五字段 crontab 语法。因此,无法将适用于其他产品的表达式粘贴到此处作为存在相同日历规则的证据。

方言翻译首先识别源语法和目标语法,而不是删除标点符号,直到验证成功。 ToolAcre 可以帮助构建目标的五个普通字段:名称、范围、列表和步骤。它无法保留不受支持的运算符所携带的语义,并且文章故意避免将这些外部运算符描述为就好像它们已实现一样。

命令转义超出了仅表达式语法

百分号和命令引用出现在时间表之后,并且位于 `parseCron` 之外。解析器将一个表达式拆分为五个空格分隔的部分;它从不读取 shell 管道、日期命令或转义命令负载。因此,尽管工作手册提出了一种百分号解决方法,但本文并未给出解决方法。

该遗漏是一个正确的决定。调度工具不应因为其计时字段有效而暗示命令是安全的。检查实际 cron 实现和 shell 中的命令语法,以及无害的输入和可观察的输出。使生成器的结果范围保持在它明显理解的日历规则范围内。

要点:限制一天字段,而不是两者 - 并且生成器的解释使 OR 在保存行之前可见

当两个日期字段都受到限制时,将它们作为并集读出并大声说“或”。更好的是,检查发电机的警告和即将到来的运行。如果这些日期超出预期设置,则将一个字段返回到 `*` 并使用目标环境记录的机制解决任何更特殊的要求。

核心教训不是 cron 很神秘;而是 cron 很神秘。它是两个相邻的列不像其他限制那样组合。 ToolAcre 将异常集中在解析、描述和预览逻辑中。在表达式离开浏览器并成为操作计划之前,使用这三个视图来捕获不匹配的情况。