Cron 表达式完整教程:语法、示例与常见问题
最后更新:2026年5月 · 阅读时间:10分钟
什么是 Cron?
Cron 是 Linux/Unix 系统中的定时任务调度程序。通过编写 Cron 表达式,你可以指定任务在什么时候自动执行,例如"每天凌晨3点备份数据库"或"每5分钟检查一次服务状态"。
Cron 表达式虽然功能强大,但语法让很多开发者头疼。本教程将帮你彻底理解它。
Cron 表达式语法
标准 Cron 表达式由 5 个字段组成,用空格分隔:
┌──────── 分钟 (0-59) │ ┌────── 小时 (0-23) │ │ ┌──── 日期 (1-31) │ │ │ ┌── 月份 (1-12) │ │ │ │ ┌─ 星期 (0-6, 0=周日) │ │ │ │ │ * * * * *
各字段取值范围
| 字段 | 含义 | 取值范围 | 说明 |
|---|---|---|---|
| 分钟 | 第几分钟执行 | 0-59 | |
| 小时 | 第几小时执行 | 0-23 | 0 = 午夜 |
| 日期 | 每月第几天执行 | 1-31 | |
| 月份 | 第几月执行 | 1-12 | 也可用 JAN-DEC |
| 星期 | 每周第几天执行 | 0-6 | 0=周日, 也可用 SUN-SAT |
特殊字符
星号 *
匹配所有值。如分钟字段使用 * 表示每分钟。
逗号 ,
列举多个值。如 1,15,30 表示第 1、15、30 分钟。
# 每天的 9:00 和 18:00 执行 0 9,18 * * *
连字符 -
指定范围。如 1-5 表示 1 到 5。
# 工作日每小时执行 0 * * * 1-5
斜杠 /
指定间隔。如 */5 表示每 5 个单位,0-30/10 表示从 0 开始每 10 个单位。
# 每 5 分钟执行 */5 * * * * # 每小时第 0 和 30 分钟执行(从 0 开始每 30 分钟) 0,30 * * * *
常用示例
| 表达式 | 含义 |
|---|---|
* * * * * | 每分钟 |
*/5 * * * * | 每 5 分钟 |
0 * * * * | 每小时 |
0 */2 * * * | 每 2 小时 |
0 0 * * * | 每天午夜 |
0 3 * * * | 每天凌晨 3 点 |
0 0 * * 0 | 每周日午夜 |
0 0 1 * * | 每月 1 日午夜 |
0 0 1 1 * | 每年 1 月 1 日午夜 |
0 9 * * 1-5 | 工作日早上 9 点 |
30 6 * * 1 | 每周一早上 6:30 |
0 */6 * * * | 每 6 小时 |
0 8,12,18 * * * | 每天 8:00、12:00、18:00 |
0 0 1,15 * * | 每月 1 日和 15 日午夜 |
5 位 vs 6 位 vs 7 位 Cron
不同系统的 Cron 表达式格式不同:
| 格式 | 字段 | 使用场景 |
|---|---|---|
| 5 位 | 分 时 日 月 周 | Linux crontab、标准 Cron |
| 6 位 | 秒 分 时 日 月 周 | Spring、Quartz、AWS EventBridge |
| 7 位 | 秒 分 时 日 月 周 年 | Quartz 完整格式 |
提示:我们的Cron 表达式生成器支持 5 位和 6 位格式,可视化编辑并显示下次执行时间。
常见问题
日期和星期同时指定会怎样?
如果日期和星期字段都不是 *,则两者是或的关系。例如 0 0 1 * 5 表示每月 1 日或每周五执行,而不是每月 1 日且是周五才执行。
Cron 表达式如何处理月末?
标准 Cron 不支持"L"(最后一天)。如需在月末执行,需要配合脚本判断:
# 每月 28-31 日执行,脚本内判断是否为最后一天 0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && your_command
Cron 的时区问题
Linux crontab 默认使用系统时区。如需使用其他时区:
CRON_TZ=America/New_York 0 9 * * * your_command
如何查看 Cron 执行日志?
# 查看 cron 日志 sudo tail -f /var/log/cron # 或查看系统日志 journalctl -u cron