Cron表情里的一个角色是我造成过的最糟糕的制作bug,我想要一个数据库备份,每天晚上午夜运行,我写 0 0 * * * 在我的脑海里,打字 0 0 * * 0 into the crontab,然后继续前进,工作运行了一次 - 接下来的星期天 - 然后一周没有再运行 我发现我什么时候需要一个不存在的备份,那个单一的错位数字变成了"每天"变成"每个星期天,"语法中没有任何东西警告我。克朗完全按照你说的去做,默默地,永远。
TL;博士: 的 克朗表达式生成器 plain字段或一键预设构建一个标准的五字段crontab表达式,在您键入时用句子解释它,并在utc中预览下一个运行时间,以便您可以在日程安排到达生产之前确认它完全在您的浏览器中运行 - 没有帐户,没有上传。
我为 toolz。dev 构建了这个工具,因为我再也没有想过提交一个我只在脑海中检查过的时间表。将 cron 表达式读回纯英语,并看到它将发射的实际日期会捕获 0 -对- * class of mistake imply。本指南涵盖了 cron 语法的工作原理、几乎所有人都被绊倒的交互以及如何使用生成器来生成一个您可以信任的表达式。
什么是 cron 表达式?
Cron表达式是由五个字段用空格分隔而成的紧凑时间表,从左到右依次为分、时、月、月、周、周,五字段形式由POSIX在 crontab 条目格式。一个调度程序 - 经典的 Unix cron daemon,还有 CI 系统、Kubernetes CronJobs 和无数的任务运行程序 - 读取表达式并在与所有字段匹配的每一刻解雇您的工作。
每个字段接受多个数字。一颗星星(*) 表示 "该字段的每个"值。列表如 1,15,30 表示几个特定的值。范围喜欢 1-5 示包容跨度。像的一步 */15 means "每十五"值从字段开始's最小值。你将这些跨五个字段组合起来,描述几乎任何重复出现的时间表:每分钟,每刻钟,工作日上午8点,每月的第一个,最后一个季度's开放日。功率是真实的,密度也是如此-五个字段可以编码出奇精确的日程表,这正是为什么它们很容易被微妙地弄错的原因。
以下是生成器使用的字段布局,以及每个字段的有效范围:
| 位置 | 场 | 范围 | 注释 |
|---|---|---|---|
| 1 | 分钟 | 0.59 | |
| 2 | 小时 | 0 23 | 24小时制 |
| 3 | 月日 | 1,31 | |
| 4锛屽湪娴欐睙鏉 | 月 | 1,12 | JAN,DEC 也被接受了 |
| 5锛屽湪娴欐睙鏉 | 一周中的某一天 | 0,6 | 0和7都表示星期日; SUN,SAT 接受 |
为什么生成表达式而不是手工编写
手写 cron 是您正确记住字段顺序、范围和交互的赌注,直到作业运行或失败为止,没有任何反馈。生成器用确认替换该赌注。当您填写字段时,它会同时执行三件事。
首先,它使用命名违规字段的消息来组装和验证表达式,捕获超出范围的值、反转范围和格式错误的步骤。类似的表达式 0 25 * * * - 25小时不存在 - 被拒绝与解释而不是接受和默默地从不运行。
其次,它将时间表呈现为一个句子。 0 8 * * 1-5 become "周一到周五08:00。"用文字读时间表是最快的方式来注意到你构建的不是你的意思。我的午夜备份错误会在我阅读的那一刻很明显"周日00:00"而不是"00:00。"
第三,它预览了实际即将到来的运行时间。看到工作将在三个月内而不是今晚解雇,它会告诉你一些事情比盯着星号更内心错误。这个预览还捕捉到了不可能的时间表 - 要求 2 月 30 日生成器根本没有显示即将到来的运行,因为没有。
Cron表达式生成器使用方法
步骤 1:从预设或空白石板开始
获得正确表达式的最快路线是从已经接近的表达式开始。选择一个预设,例如 "Weekdays at 8am," "每 15 分钟," 或 "每月第一天午夜," 和字段加载准备调整。如果没有适合,则从每分钟默认开始并编辑。预设的存在是因为大多数真实的时间表是十几种常见模式的变体,并且从已知良好的表达式开始消除了一整类错误。
2步:设置五个字段
在每个字段中输入一个值,或将其保留为 * for "every。" 每个字段接受单个值、逗号列表、连字符范围或斜线步骤,例如,在工作日营业时间内,在每个小时的顶部运行,将分钟设置为 0,小时到 9-17并且星期几到 1-5、留月日月为 *。每个字段下的提示会提醒您其有效范围,因此您不必记住顺序。
3步:阅读纯英文描述
Type时观看描述更新,这是拯救你的步骤,如果句子与你脑子里的日程安排不符,表达方式就错了,而且你一周后在浏览器中而不是在生产中确认时间、天数、任何月份的限制,按照你打算的方式阅读。
4步:检查下一次运行并复制
UTC 中计算的点击预览即将到来的运行时间,扫描它们是否有任何令人惊讶的 - 差距太长,第一次运行太远,或者用空列表来表示不可能日期,当日程表看起来正确时,复制表达式并将其粘贴到您的 crontab、pipeline 或 CronJob 清单中。
月日和周日的陷阱
Cron的一件事,你记住了,就做这个吧,因为第一次几乎让所有人都感到惊讶。当 两者 月日字段和周日字段受到限制 - 这意味着两者都不受限制 * - 标准 cron 将它们与 OR 结合起来,而不是 AND。工作运行时 要么 条件匹配。
所以 0 0 13 * 5 does not mean "midnight on Friday the 13th。" Mean "midnight on the 13th of each month, and also midnight on each Friday。" those are very different schedule; the second fire many times a month。this action comes trible from the original Vixie cron implementation that most schedulers herited, and the generator honor it excellently。its next run preview will show you both the 13ths and the Fridays, which is
实际规则:将两天字段之一留为 * or行为除非你真心想要,如果你真的需要"仅限13号星期五,"cron无法用一种表达方式表达出来- 你在工作中处理了那个逻辑,在预览中看到实际的运行日期,这才是将这从潜伏的gotcha变成一个显而易见的、可见的事实的原因。
实践中的步骤、范围和列表
步骤语法是大量调度能力的所在,也是大量混乱开始的地方。 */5 in 分钟字段表示分钟 0, 5, 10, 15, 以此类推到 55 - "每五分钟。"您可以锚定一个步骤到一个范围: 0-30/10 仅表示 0、10、20 和 30 分钟。带有步骤的裸值,例如 5/15 在分钟字段中,表示"从 5 开始,每 15 个"最多字段 - 5、20、35、50。
列表和范围自由组合。 1,4,7,10 本月字段为您提供季度时间表 - 一月、四月、七月、十月。 1-5 每周一天为您提供周一至周五。 9-17 in 小时字段给你一个九五之窗。把它们混合, 0 9-17 * * 1-5 读作 "周一至周五上午 9 点至下午 5 点,每小时的第 0 分钟 " - 常见的营业时间心跳。生成器扩展并验证所有这些,并且描述阐明了您构建的内容,因此对于范围是否具有包容性(确实如此)没有歧义。
常见用例
预定的备份和维护。 规范的 cron 作业。生成 0 2 * * * 2am的夜间备份,请阅读说明以确认它是每日而不是每周,并预览下一次运行,以确保第一个是今晚,这是我多年前犯的确切错误,预览防止的确切错误。
CI 和部署时间表。 Nightly building、排程测试运行和周期部署都使用 GitHub Actions、GitLab CI 和类似系统中的 cron 语法。在此处构建表达式, 确认它, 并粘贴到您的工作流文件中。因为这些系统运行在自己的服务器上, 请注意下面的时区注意事项。
数据管道和报告。 每周一早上 6 点的每周报告是 0 6 * * 1;第一个每月卷起一次是 0 0 1 * *;季度工作是 0 0 1 1,4,7,10 *.生成这些并读回它们 停止经典"在错误的一天"运行管道事件。
缓存变暖和心跳。 诸如此类的高频工作 */5 * * * * keep缓存温暖或健康检查滴答作响,预览确认间隔是你所期望的,而不是,比如说,每小时一次,因为你把步骤放在了错误的字段中。
学习亲信。 如果您仍在构建直觉,生成器是一种教学工具。键入表达式、读取句子、查看运行情况,语法和行为之间的映射就会以文档本身从未管理的方式变得具体。
关于时区的注释
UTC 中下一次运行预览计算时间,因此结果是确定性的,对于阅读此内容的每个人来说都是一样的。然而,真正的 cron 守护进程在服务器中运行's 本地时区,除非另有配置,并且 CI 提供程序各自有自己的约定 - 许多默认 UTC,有些不携带时区;它是调度程序决定的。因此,当您将表达式从此工具移动到实时系统时,请确认该系统's 时区并相应地抵消您头部中的运行时间。A 0 0 * * * 工作是午夜--但午夜 哪里 完全取决于工作运行的位置。如果您需要推理时区偏移, 时区转换器 很方便,而且 时间戳转换器 当您的调度程序日志作为 Unix 时间戳运行时会有所帮助。
生成与解析表达式
该工具从字段构建表达式。它的兄弟姐妹, 克朗表达式解析器,反之亦然:粘贴一个已有的表达式,它对其进行解释并预览其运行,两者涵盖了同一问题的两个方向,当您知道想要的时间表和需要语法时使用生成器;当您继承了一个表达式并需要了解它所做的事情时使用解析器。两者都尊重相同的 Vixie-cron 语义,包括月日或周日规则,因此您在一个中读到的描述与您在另一个中看到的行为相匹配。它们在一起是我描述的更广泛的套件中的一对小而专注的对 web开发人员工具包 概述和更广泛 编码工具指南。
隐私:这一切都在您的浏览器中运行
这里没有什么可以上传的,也没有什么可以上传的表达式完全用客户端代码构建、验证、描述和模拟。这比看起来更重要:内部作业计划可以揭示有关系统的东西's架构和你不希望坐在第三方的节奏's日志。您可以通过断开与互联网的连接来确认该工具是独立的 - 它继续工作。这是 toolz。dev 上每个工具背后的相同客户端原则,我在 2017 年 12 月 12 日对此进行了充分阐述 在线工具中的数据隐私 文章。
常问问题
如何写cron表达式?
标准 cron 表达式有五个字段,由空格分隔:分钟、小时、月份的日期、月份和星期的日期,每个字段都是一个特定的值、一个列表、一个范围、一个步骤或 * 对于每一个。例如, 0 8 * * 1-5 表示周一至周五 08:00。此工具为您构建表达式并显示其含义。
五克朗场是什么意思?
从左到右依次为分钟(0 到 59)、小时(0 到 23)、月份日(1 到 31)、月份(1 到 12)和星期日(0 到 6,其中 0 和 7 均表示星期日)。字段中的星星表示该字段的 "every" 值。工具标记每个字段,因此您不必记住顺序。
什么 */5 卑鄙的在亲信里?
Slash引入了一个步值,在分钟字段中, */5 means "每5分钟" - 0,5,10,15, 依此类推, 您也可以将步骤与范围组合: 0-30/10 in 分钟字段表示分钟 0、10、20、30 步骤是表示"每个 N 个单位的标准方式。"
为什么我的工作在月日和星期几设置时比预期的更频繁?
Cron惊喜最常见,当月日与周日字段都受到限制时(两者都不是) *),标准 cron 将它们视为 OR,而不是 AND - 当任一条件匹配时作业就会运行。所以 0 0 13 * 5 13日月和每个星期五运行, 不仅在13日星期五。留下一个字段为 * 除非您真正想要手术室行为。
下一个运行时间显示在哪个时区?
UTC 中预览计算即将运行,因此结果对每个人来说都是一样的,真正的 cron 守护进程使用服务器时区(或 TZ 设置),因此如果您的服务器在不同的区域运行,则相应地抵消时间表达式本身不携带时区 - 是调度程序决定。
我可以使用 mon 或 jan 之类的名称而不是数字吗?
是的。该月字段接受 JAN 通过 DEC 周日字段接受 SUN 通过 SAT、case-insensitive。工具在验证和描述你的表达式时理解它们。数字值在跨调度程序中更便携,因此生成器发出数字,但完全支持命名输入。
这和crontab语法一样吗?
是的,这会生成 crontab、大多数 CI 系统和 Kubernetes CronJobs 使用的标准五字段 Unix/Vixie cron。一些调度程序添加第六秒字段或非标准扩展,例如 @reboot;那些不是五域标准的一部分,对于绝大多数的调度需求,这个工具产生的五域表达式正是你想要的。
我的日程安排会发送到任何地方吗?
No。表达式完全在你的浏览器中用客户端代码构建、验证、描述和模拟。没有上传或存储任何内容。您可以通过断开互联网连接来确认这一点 - 生成器仍然有效。



