Cron 表达式控制着几乎所有定时任务的执行时机——Linux crontab、GitHub Actions 的 schedule、Kubernetes CronJob、AWS EventBridge 都用这套语法。五个字段挤在一起,0 9 * * 1-5 不对照参考资料很难直接读懂。在线解析器把表达式翻译成人话,还能即时验证写法是否正确。
Cron 表达式结构
标准的 cron 表达式由五个字段组成,用空格分隔:
┌───────── 分钟 (0–59)
│ ┌───────── 小时 (0–23)
│ │ ┌───────── 日 (1–31)
│ │ │ ┌───────── 月 (1–12)
│ │ │ │ ┌───────── 星期几 (0–7,0 和 7 都是周日)
│ │ │ │ │
* * * * *
Quartz、Spring、AWS Lambda 等系统使用六或七字段格式,在最前面加了秒字段(0–59),或者在最后加了年份字段。解析器支持两种变体。
特殊字符速查
| 字符 | 含义 | 示例 |
|---|---|---|
* | 所有值 / 每个单位 | * * * * * — 每分钟 |
, | 列举多个值 | 1,15 * * * * — 第 1 分钟和第 15 分钟 |
- | 范围 | 1-5 * * * * — 第 1 到第 5 分钟 |
/ | 步长 | */15 * * * * — 每 15 分钟 |
L | 最后 | 0 0 L * * — 每月最后一天(非标准) |
# | 第 N 个星期几 | 0 10 * * 1#2 — 每月第二个周一 |
? | 无特定值 | Quartz 格式中用于日或星期几字段 |
20 个常用 Cron 表达式
每 N 分钟
# 每分钟
* * * * *
# 每 5 分钟
*/5 * * * *
# 每 15 分钟
*/15 * * * *
# 每 30 分钟
*/30 * * * *
按小时和天
# 每小时整点
0 * * * *
# 每天零点(UTC)
0 0 * * *
# 每天早上 9 点(UTC)
0 9 * * *
# 每天早 8 点和晚 8 点各一次
0 8,20 * * *
按工作日
# 每个工作日早 9 点
0 9 * * 1-5
# 每周一早 9 点
0 9 * * 1
# 周一、三、五中午
0 12 * * 1,3,5
# 周末早 10 点
0 10 * * 0,6
按月、季度
# 每月 1 号零点
0 0 1 * *
# 每月 1 号和 15 号零点
0 0 1,15 * *
# 每季度第一天(1、4、7、10 月)
0 0 1 1,4,7,10 *
其他常见场景
# 元旦零点
0 0 1 1 *
# 每周日凌晨 4 点(维护窗口)
0 4 * * 0
# 每 6 小时
0 */6 * * *
各平台差异
Linux crontab
标准五字段语法,使用系统时区。
# 查看当前 crontab
crontab -l
# 编辑 crontab
crontab -e
指定时区:
TZ=Asia/Shanghai
0 9 * * 1-5 /path/to/script.sh
GitHub Actions
五字段格式,固定 UTC 时区。注意在高负载时实际执行可能延迟几分钟:
on:
schedule:
- cron: '0 1 * * *' # UTC 凌晨 1 点,即北京时间早 9 点
北京时间早 9 点对应 UTC 1:00(非夏令时)。
Kubernetes CronJob
标准五字段,Kubernetes 1.27+ 支持 spec.timeZone:
spec:
schedule: "0 9 * * 1-5"
timeZone: "Asia/Shanghai"
AWS EventBridge
AWS 使用六字段格式,第一位是秒,? 必须出现在日或星期几字段之一:
cron(0 1 ? * MON-FRI *) # 每个工作日 UTC 1:00
rate(5 minutes) # 每 5 分钟(rate 表达式更简单)
快速读懂 Cron 表达式
几个规律记住后,大多数表达式可以直接读出来:
- 第一个字段是
0+ 第二个字段有值 = “在那个小时的整点” - 字段是
*= “每个” */n= “每 n 个单位”a-b= “从 a 到 b 的连续范围”a,b,c= “只在 a、b、c 这几个值上”
所以 0 9 * * 1-5:分钟 0、小时 9、任意日、任意月、周一到周五 → 每个工作日早上 9:00。
常见问题排查
任务没有执行? 检查清单:
- cron 守护进程是否运行:
systemctl status cron - 脚本是否有执行权限:
chmod +x script.sh - 脚本内是否使用了绝对路径(cron 的
$PATH很短) - 是否保存了 crontab:
crontab -l确认 - 查看日志:
/var/log/syslog或journalctl -u cron
输出丢失? cron 默认把输出发邮件。重定向到日志文件:
0 9 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
时区搞错了? 国内服务器经常是 UTC,任务时间要换算。最稳的方式是在 crontab 顶部设置 TZ=Asia/Shanghai,或者在脚本里加时区判断。
上线前先验证表达式。立即使用 Cron 表达式解析器 →