什么是Cron表达式?
Cron是Unix/Linux系统内置的基于时间的任务调度器。Cron表达式是告诉cron何时运行任务的语法。
你一定见过:0 0 * * *。它的意思是"每天午夜"。但一旦超出基础范围,cron语法就变得复杂——5个字段、可选的秒、平台差异,以及大多数人不理解就复制粘贴的特殊字符。
本指南让这一切变得清晰。
5个(或6个)字段
标准cron使用5个用空格分隔的字段:
┌──────────── 分钟 (0–59)
│ ┌────────── 小时 (0–23)
│ │ ┌──────── 月份中的天 (1–31)
│ │ │ ┌────── 月份 (1–12)
│ │ │ │ ┌──── 星期几 (0–7, 0和7都是周日)
│ │ │ │ │
* * * * *
某些系统(AWS EventBridge、Spring、Quartz)在开头添加秒字段,变成6个字段。请检查你的平台。
特殊字符
| 字符 | 含义 | 示例 |
|---|---|---|
* | 所有值 | * * * * * = 每分钟 |
, | 多个值 | 0 9,17 * * * = 上午9点和下午5点 |
- | 范围 | 0 9-17 * * * = 每天9点到17点每小时 |
/ | 步长 | */15 * * * * = 每15分钟 |
L | 最后 | 0 0 L * * = 每月最后一天(仅Quartz) |
? | 不指定 | 0 0 ? * MON = 每周一,任意日期(Quartz) |
常用Cron表达式
每分钟
* * * * *
每5分钟
*/5 * * * *
每小时整点
0 * * * *
每天午夜
0 0 * * *
每天上午9点
0 9 * * *
每周一上午9点
0 9 * * 1
每个工作日(周一到周五)上午8点
0 8 * * 1-5
每个周末中午
0 12 * * 0,6
每月第一天午夜
0 0 1 * *
每季度(1、4、7、10月)午夜
0 0 1 1,4,7,10 *
工作日9点到17点每30分钟
*/30 9-17 * * 1-5
常见陷阱
"每2小时"是 0 */2 * * *,不是 */2 * * * *
*/2 * * * * 意思是每2分钟。步长作用于它所在的字段。
周日是0也是7
在标准cron中,0和7都表示周日。避免歧义——统一使用0。
月份中的天 与 星期几 是OR关系,不是AND
0 0 1 * 1 会在每月1号以及每个周一执行——不仅仅是落在1号的周一。如果你想要"每月第一个周一",需要在cron外部实现脚本逻辑。
时区
除非另行配置,cron在服务器的本地时区运行。UTC服务器上0 9 * * *的任务在UTC上午9点运行——在你的时区可能是凌晨2点或晚上11点。
始终检查:
timedatectl # 显示Linux上的当前时区
命名快捷方式(非标准但广泛支持)
| 快捷方式 | 等价 | 含义 |
|---|---|---|
@yearly | 0 0 1 1 * | 每年一次 |
@monthly | 0 0 1 * * | 每月一次 |
@weekly | 0 0 * * 0 | 每周一次(周日) |
@daily | 0 0 * * * | 每天一次(午夜) |
@hourly | 0 * * * * | 每小时一次 |
@reboot | — | 系统启动时 |
生成和验证Cron表达式
Cron生成器支持可视化构建表达式——用中文描述计划,获取cron表达式。不再需要猜测0 9 * * 1-5是否正确。
反向也支持:粘贴任意cron表达式,获取该表达式何时运行的简明解释。
快速参考卡
# ┌──── 分钟 0-59
# │ ┌─── 小时 0-23
# │ │ ┌── 日 1-31
# │ │ │ ┌─ 月 1-12
# │ │ │ │ ┌ 星期 0-7 (0=周日)
# │ │ │ │ │
* * * * * 每分钟
0 * * * * 每小时
0 0 * * * 每天午夜
0 9 * * 1 每周一上午9点
*/15 * * * * 每15分钟
0 0 1 * * 每月第一天