Cron 时间表达式详解
Cron 是一种定时任务调度方式,常用于 Unix/Linux 系统,也可以在许多 CI/CD 工具、调度程序(如 Kubernetes、GitHub Actions 等)中使用。它的时间表达式由 5 个或 6 个字段 组成,用于指定任务的执行时间。
1. Cron 表达式的基本格式
通常,Cron 表达式包含 5 个时间字段(在某些环境下可能有 6 个字段),格式如下:
┌──────── 分钟 (0 - 59)
│ ┌────── 小时 (0 - 23)
│ │ ┌──── 每月的哪一天 (1 - 31)
│ │ │ ┌── 月份 (1 - 12)
│ │ │ │ ┌ 星期几 (0 - 7, 0 和 7 代表周日)
│ │ │ │ │
* * * * *
如果环境支持 秒 字段(如 Quartz),则会变成 6 个字段:
秒 分钟 小时 日期 月份 星期
2. 各字段的含义
字段 | 允许的值 | 含义 |
---|---|---|
分钟 | 0-59 | 任务执行的具体分钟 |
小时 | 0-23 | 任务执行的具体小时(24 小时制) |
日期 | 1-31 | 任务执行的具体日期 |
月份 | 1-12 | 任务执行的月份 |
星期 | 0-7 | 任务执行的星期几(0 和 7 代表周日,1-6 代表周一到周六) |
3. Cron 表达式的常用写法
表达式 | 解释 |
---|---|
0 12 * * * | 每天中午 12:00 触发 |
0 0 * * * | 每天午夜 00:00 触发 |
*/5 * * * * | 每 5 分钟执行一次 |
0 8,20 * * * | 每天 08:00 和 20:00 触发 |
0 9-17 * * * | 每天 09:00 到 17:00(每小时执行一次) |
0 12 1 * * | 每月 1 号中午 12:00 触发 |
0 0 * * 0 | 每周日午夜 00:00 触发 |
0 0 1 1 * | 每年 1 月 1 号 00:00 触发 |
4. 特殊符号用法
Cron 支持一些特殊符号,让调度更灵活:
符号 | 作用 | 示例 | 解释 |
---|---|---|---|
* | 任意值 | 0 * * * * | 每小时的第 0 分钟执行 |
, | 多个值 | 0 9,12,18 * * * | 每天 9:00、12:00 和 18:00 触发 |
- | 范围 | 0 9-17 * * * | 每天 09:00 到 17:00 每小时触发 |
/ | 间隔 | */10 * * * * | 每 10 分钟执行一次 |
? | 任何值(仅用于日期和星期字段) | 0 12 * * ? | 每天中午 12:00 触发(不指定星期几) |
L | 最后一天(仅用于日期和星期) | 0 0 L * * | 每月最后一天 00:00 触发 |
W | 最近的工作日(仅用于日期) | 0 8 15W * * | 每月 15 号最近的工作日 08:00 触发 |
# | 每月的第几个星期几 | 0 0 * * 2#1 | 每月的第一个星期二 00:00 触发 |
5. 进阶示例
表达式 | 解释 |
---|---|
*/15 9-17 * * 1-5 | 工作日 09:00-17:00 之间每 15 分钟执行一次 |
0 22 * * 1-5 | 每周一到周五的 22:00 触发 |
0 0 1 * 1 | 每月 1 号且是星期一的午夜 00:00 触发 |
0 8-18/2 * * * | 每天 08:00 到 18:00 之间,每 2 小时执行一次 |
0 0 L * * | 每月最后一天 00:00 触发 |
0 0 * * 6,0 | 每周六和周日午夜 00:00 触发 |
6. 注意事项
- 星期和日期不能同时指定:例如
0 12 15 * 3
(每月 15 号且是星期三)不会生效,应该使用?
代替其中一个字段,如0 12 15 * ?
(每月 15 号)。 - 考虑时区:Cron 默认使用服务器时区,需要理解时区差异,或者使用
TZ
变量指定时区。 - 避免高频任务:例如
* * * * *
(每分钟执行)可能会造成资源占用过高,应避免在高负载环境中使用。
7. 结论
- 基本格式:
分 时 日 月 周
- 常见写法:
0 12 * * *
(每天中午 12:00) - 特殊符号:
*
(任意值),
(多个值)-
(范围)/
(间隔)L
(最后一天)W
(最近的工作日)#
(每月第几个星期几)
发表回复