Cron 表达式解析器
Cron 表达式定义了类 Unix 系统中循环任务的调度计划。此工具解析 Cron 语法(5-7 个字段),用通俗语言解释每个字段,计算下次计划执行时间,并警告常见错误。支持用户 crontab 格式和带用户及命令字段的系统 crontab 格式。
规范
常见用例
- 调试 Cron 任务未在预期时间运行的原因
- 理解配置中继承的 Cron 表达式
- 规划备份和维护计划
- 验证 CI/CD 管道计划(GitHub Actions、GitLab CI)
- 在部署前测试 Kubernetes CronJob 计划
- 分析来自 /etc/crontab 或 /etc/cron.d/ 的系统 crontab 条目
功能
- 解析 5 字段(标准)、6 字段(含秒)和 7 字段(含秒和年)的 Cron 表达式
- 支持带用户字段的系统 crontab 格式(例如 "0 5 * * * root /path/to/script")
- 从 Cron 行中提取并显示命令
- 用人类可读的语言解释每个字段
- 计算下 10 次计划执行时间
- 支持范围(1-5)、列表(1,3,5)、步长(*/15)和名称(MON、JAN)
- 警告常见问题,如在计划中指定第 31 天
示例
带用户和命令的系统 Crontab
试试看 →每天凌晨 5 点以 root 用户运行的每日备份(来自 /etc/crontab 的系统 crontab 格式)。
0 5 * * * root /usr/bin/backup.sh提示
- 五个字段依次是:分钟(0-59)、小时(0-23)、月中日(1-31)、月份(1-12)、星期几(0-6,周日=0)。
- 系统 crontab(/etc/crontab、/etc/cron.d/*)在命令前有第 6 个用户名字段。
- 用户 crontab(crontab -e)没有用户名字段;它们以 crontab 所有者身份运行。
- 使用 * 表示"每个",*/n 表示"每隔 n 个"。
- 星期名称(SUN-SAT)和月份名称(JAN-DEC)不区分大小写。
- 同时使用月中日和星期几要小心;不同实现的行为有所不同。
理解 Cron 表达式解析器
Cron 是类 Unix 操作系统中基于时间的任务调度程序,Cron 表达式是定义任务运行时间的紧凑语法。标准的五字段格式指定分钟(0-59)、小时(0-23)、月中日(1-31)、月份(1-12)和星期几(0-6,其中 0 为周日)。星号(*)匹配所有值,因此 "* * * * *" 表示每分钟运行。
除了简单值,Cron 还支持多种运算符。范围(1-5)匹配连续范围。列表(1,3,5)匹配离散值。步长值(*/15)创建固定间隔。这些可以组合使用:星期几字段中的 1-5/2 表示周一、周三、周五。月份和星期几字段接受三字母名称(JAN-DEC、SUN-SAT)。
Cron 的实现各有不同。用户 crontab 有五个字段加命令。系统 crontab 在命令前添加用户名字段。某些实现支持第六个秒字段(Spring、Quartz、Kubernetes)和第七个年字段。AWS EventBridge、GitHub Actions 和其他云调度器都有各自的变体。
常见陷阱包括月中日和星期几字段的交互:如果两者都被指定(非 *),任务在任一条件为真时运行(OR 逻辑)。时区处理是另一个问题——除非设置了 CRON_TZ,否则 Cron 任务在系统时区运行,夏令时转换可能导致任务跳过或运行两次。
/ 运算符创建步长值。分钟字段中的 */5 表示"每 5 分钟",在每小时的第 0、5、10、15、20、25、30、35、40、45、50 和 55 分钟运行。范围可以与步长组合:10-30/5 表示在第 10 分钟到第 30 分钟之间每 5 分钟运行一次。要在特定日期的特定时间运行任务,将分钟和小时字段设为所需时间,星期几字段设为目标日期。例如,"30 14 * * 1-5" 在周一至周五的下午 2:30 运行,"0 9 * * 0" 在每周日上午 9 点运行。除非明确配置了 CRON_TZ,否则所有时间都按服务器本地时区解释。
Cron 使用挂钟时间,这意味着夏令时转换可能导致意外行为。当时钟前拨时,计划在凌晨 2:00 到 2:59 之间的任务可能被完全跳过。当时钟后拨时,该时间段内的任务可能运行两次。对于关键任务,设置 CRON_TZ=UTC 可以避免这些问题。或者,避免在转换时间段内调度任务,或将任务设计为幂等的,这样重复运行不会造成问题。
Cron 语法已被广泛应用于 Unix 系统之外。Kubernetes CronJob、GitHub Actions、GitLab CI、AWS EventBridge、Google Cloud Scheduler、Spring @Scheduled 以及许多任务队列库都使用 Cron 表达式进行调度。但每种实现支持的功能可能不同——有些添加了秒字段,有些添加了年字段,有些使用 ? 在月中日或星期几字段中表示"无特定值"。