Cron 表达式语法:完整指南与示例
Cron 表达式语法
cron 是 Unix 类系统上的标准任务调度器。每个 cron 表达式都以紧凑的字符串定义调度计划,指定命令应在何时运行。理解语法对于自动化备份、日志轮转和维护任务至关重要。
5 字段格式
标准 cron 表达式有五个以空格分隔的字段:
* * * * *
| | | | |
| | | | +----- 星期几(0-7,0 和 7 都表示周日)
| | | +------- 月份(1-12)
| | +--------- 日(月中第几天,1-31)
| +----------- 小时(0-23)
+------------- 分钟(0-59)
字段详解
| 字段 | 范围 | 特殊字符 | 示例 |
|-------|-------|-------------------|---------|
| 分钟 | 0-59 | , - * / | 30 = 在第 30 分钟 |
| 小时 | 0-23 | , - * / | 6 = 在早上 6 点 |
| 日(月中第几天) | 1-31 | , - * / | 15 = 在每月 15 日 |
| 月份 | 1-12 | , - * / | 6 = 在六月 |
| 星期几 | 0-7 | , - * / | 0 = 在周日 |
分钟控制执行的具体分钟:30 * * * * 在每小时的第 30 分钟运行。小时定义一天中的时间:0 6 * * * 每天 6:00 运行。日字段限制为特定的日历日期:0 0 15 * * 每月 15 日午夜运行。月份将执行限制在特定月份:0 0 1 6 * 在 6 月 1 日运行。星期几控制哪些工作日:0 8 * * 1-5 在周一至周五早上 8 点运行。
重要提示: 第 29-31 天只在包含这些日期的月份中执行。在较短的月份中,这些值会被静默跳过。
特殊字符
| 字符 | 名称 | 用途 | 示例 |
|------|------|---------|---------|
| * | 星号 | 所有可能的值 | 分钟字段中的 * = 每分钟 |
| , | 逗号 | 值列表 | 1,15,30 = 第 1、15、30 分钟 |
| - | 连字符 | 范围 | 9-17 = 第 9 到第 17 小时 |
| / | 斜杠 | 步进值 | */5 = 每 5 分钟 |
使用斜杠的步进值
斜杠表示"每 N 个单位":
# 每 5 分钟
*/5 * * * *
# 每 2 小时
0 */2 * * *
# 工作时间内每 15 分钟
*/15 9-17 * * *
常见 Cron 调度模式
| 调度 | 表达式 | 描述 |
|----------|------------|-------------|
| 每分钟 | * * * * * | 每天运行 1,440 次 |
| 每 5 分钟 | */5 * * * * | 健康检查、监控 |
| 每小时 | 0 * * * * | 每小时整点 |
| 每天两次 | 0 6,18 * * * | 早上 6 点和下午 6 点 |
| 每天午夜 | 0 0 * * * | 经典维护任务 |
| 每周日 | 0 0 * * 0 | 每周维护 |
| 每月 1 日 | 0 0 1 * * | 每月报告 |
| 工作日早上 9 点 | 0 9 * * 1-5 | 工作时间开始 |
非标准快捷方式
某些 cron 实现支持命名快捷方式:@yearly(1 月 1 日)、@monthly(每月 1 日)、@weekly(周日)、@daily(午夜)、@hourly 和 @reboot(系统启动时运行一次)。Vixie cron、cronie 和 systemd 定时器均支持。
常见错误
- 同时设置日字段和星期几字段会创建 OR 条件——当任一条件匹配时任务就会运行,这通常不是本意。
- cron 使用系统时区。靠近夏令时切换时间的任务可能会运行两次或完全不运行。
- 始终数够五个字段。四个字段无效;六个字段需要扩展的 cron 语法。
测试你的 Cron 表达式
使用 cron 表达式验证器检查语法、预览即将到来的执行时间,并在错误影响生产环境之前发现它们。三十秒的校验就能防止静默的调度失败。