Cron 表达式速查表 — 像专家一样调度任务
Cron 是 Unix 类系统中计划任务自动化的基石。无论是日志轮换、数据库备份还是触发 CI/CD 流水线,cron 表达式定义了这些任务何时执行。语法简洁但强大——如果靠猜测很容易出错。
本参考涵盖了 cron 语法的每个部分,并附有实用的可复制粘贴的示例。如果你想交互式地构建和验证表达式,请在阅读本指南的同时打开 Cron 表达式构建器。
Cron 语法:五个字段
标准 cron 表达式由空格分隔的五个字段组成:
┌───────────── 分钟 (0–59)
│ ┌───────────── 小时 (0–23)
│ │ ┌───────────── 日 (1–31)
│ │ │ ┌───────────── 月 (1–12)
│ │ │ │ ┌───────────── 星期 (0–7,其中 0 和 7 = 星期日)
│ │ │ │ │
* * * * *
每个字段接受特定值、范围、列表或通配符。五个字段组合在一起指定精确的重复调度。
| 字段 | 允许值 | 特殊字符 |
|---|---|---|
| 分钟 | 0–59 | * , - / |
| 小时 | 0–23 | * , - / |
| 日 | 1–31 | * , - / |
| 月 | 1–12 | * , - / |
| 星期 | 0–7 | * , - / |
月和星期字段在大多数实现中也接受三字母缩写(JAN–DEC、SUN–SAT)。
特殊字符说明
理解四个特殊字符即可解锁 cron 的全部功能:
星号 * — "每个"
匹配该字段的所有可能值。
* * * * * # 每天每小时每分钟执行
逗号 , — "和"
指定离散值列表。
0 9,12,18 * * * # 每天 9:00、12:00 和 18:00 执行
连字符 - — "到"
定义包含范围。
0 9-17 * * * # 从上午 9 点到下午 5 点每小时执行
斜杠 / — "每第 n 个"
从范围起始设置步进间隔。
*/10 * * * * # 每 10 分钟(0、10、20、30、40、50)
可以将范围与步进结合:
0 9-17/2 * * * # 上午 9 点到下午 5 点每 2 小时(9、11、13、15、17)
常用 Cron 调度示例
收藏此表。这些是你会反复使用的调度。
| 调度 | 表达式 | 说明 |
|---|---|---|
| 每分钟 | * * * * * | 每分钟开始时执行 |
| 每 5 分钟 | */5 * * * * | 第 0、5、10、15、…、55 分钟 |
| 每 15 分钟 | */15 * * * * | 第 0、15、30、45 分钟 |
| 每小时 | 0 * * * * | 每小时第 0 分钟执行 |
| 每 6 小时 | 0 */6 * * * | 00:00、06:00、12:00、18:00 |
| 每天午夜 | 0 0 * * * | 每天一次,00:00 执行 |
| 每天凌晨 3 点 | 0 3 * * * | 每天一次,03:00 执行 |
| 每周一上午 9 点 | 0 9 * * 1 | 每周一 09:00 执行 |
| 工作日上午 8 点 | 0 8 * * 1-5 | 周一至周五 08:00 |
| 周末中午 | 0 12 * * 0,6 | 周六、周日 12:00 |
| 每月 1 日 | 0 0 1 * * | 每月 1 日午夜 |
| 每季度(1、4、7、10 月) | 0 0 1 1,4,7,10 * | 季度月 1 日午夜 |
| 工作时间每 15 分钟 | */15 9-17 * * 1-5 | 工作日 9 点–17 点,每 15 分钟 |
将任何表达式粘贴到 Cron 表达式构建器 中以可视化下次执行时间。
高级模式
组合列表和范围
字段接受混合语法。在工作日上午 8 点和下午 6 点运行任务:
0 8,18 * * 1-5
使用步进指定特定月份:
0 0 1 1-12/3 * # 从一月开始每 3 个月(1月、4月、7月、10月)
日 vs. 星期
当日和星期都被设置(非 *)时,行为取决于实现。在标准 cron 中,如果任一条件满足,任务就会执行——是 OR 关系,不是 AND。这让很多人措手不及。
0 0 15 * 1 # 在 15 日和每周一执行——不是"15日的周一"
启动时执行
虽然严格来说不是 cron 表达式,但 @reboot 是一个广泛支持的简写:
@reboot /usr/local/bin/start-service.sh
其他常见简写:
| 简写 | 等效表达式 |
|---|---|
@yearly | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
不同环境中的 Cron
五字段语法是通用的,但配置 cron 的方式因平台而异。
Linux Crontab
经典方式。使用 crontab -e 编辑用户 crontab:
# 每天凌晨 2 点运行备份
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
/etc/cron.d/ 中的系统级 cron 任务包含额外的用户字段:
0 2 * * * root /usr/local/bin/cleanup.sh
GitHub Actions
GitHub Actions 在 schedule 触发器中使用相同的五字段语法。所有时间为 UTC。
on:
schedule:
- cron: '0 3 * * 1-5' # 工作日 UTC 凌晨 3 点
有关 YAML 配置的深入了解,请参阅 Kubernetes 的 YAML 和 Docker Compose 的 YAML。
Kubernetes CronJob
Kubernetes 将 cron 表达式封装在 CronJob 资源中:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: report
image: reporting:latest
command: ["python", "generate_report.py"]
restartPolicy: OnFailure
Kubernetes 默认使用 UTC。从 v1.25 开始,你可以在 CronJob 规范中设置 timeZone: "America/New_York"。
AWS CloudWatch (EventBridge)
AWS 使用稍有不同的语法,包含六个字段(添加秒)和 rate() / cron() 包装器:
cron(0 3 * * ? *) # 每天 UTC 凌晨 3 点
注意 ? 字符——当另一个被指定时,AWS 要求日或星期中的一个使用 ?。这与标准 cron 不同。
常见陷阱
1. 时区混淆
Cron 在 Linux 上默认使用系统时区,但 Kubernetes 和 GitHub Actions 在 UTC 下运行。设置为 0 9 * * * 的任务将在 UTC 上午 9 点触发,即北京时间下午 5 点。
始终验证调度器使用的时区。有关时间戳转换,我们的 Unix 时间戳详解 指南详细介绍了 UTC 偏移。
2. 执行重叠
如果任务耗时超过运行间隔,你将得到重叠的实例。在 */5 * * * * 调度上运行 8 分钟的脚本会堆积。
解决方案:
- 使用锁文件(Linux 上的
flock) - 在 Kubernetes CronJob 中设置
concurrencyPolicy: Forbid - 在脚本开始时检查正在运行的实例
3. 输出缺失和调试
Cron 默认不捕获 stdout。始终重定向输出:
*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
如果 cron 任务没有运行,检查:
grep CRON /var/log/syslog查看执行日志- 脚本的文件权限
PATH环境变量——cron 默认有一个最小的PATH
4. "每月 31 日"陷阱
0 0 31 * * # 仅在有 31 天的月份执行
这在 1 月、3 月、5 月、7 月、8 月、10 月和 12 月执行,但会静默跳过其他五个月。如果需要月末任务,考虑在 1 日运行并调整脚本逻辑,或使用支持"月末"语义的工具。
5. 忘记 Crontab 末尾的换行符
某些 cron 实现要求 crontab 文件末尾有换行符。如果最后一个条目不执行,在末尾添加空行。
可视化构建表达式
记忆语法适用于常见模式,但复杂调度通过可视化方式构建更容易。alltools.one 的 Cron 表达式构建器 让你可以:
- 通过下拉菜单选择每个字段的值
- 查看调度的人类可读描述
- 预览即将到来的执行时间
- 一键复制最终表达式
完全在浏览器中运行——不会向任何服务器发送数据。
快速参考卡
将此块复制到项目文档或团队 wiki 中:
# ┌───── 分钟 (0-59)
# │ ┌───── 小时 (0-23)
# │ │ ┌───── 日 (1-31)
# │ │ │ ┌───── 月 (1-12)
# │ │ │ │ ┌───── 星期 (0-7,日=0 或 7)
# │ │ │ │ │
# * * * * *
*/5 * * * * # 每 5 分钟
0 * * * * # 每小时
0 0 * * * # 每天午夜
0 9 * * 1-5 # 工作日上午 9 点
0 0 1 * * # 每月 1 日
*/15 9-17 * * 1-5 # 工作时间每 15 分钟
延伸阅读
- Unix 时间戳详解 — 理解纪元时间和时区转换
- Kubernetes 的 YAML — 配置 CronJob 和其他 Kubernetes 资源
- Docker Compose 的 YAML — 在 Compose 配置中调度容器
准备构建下一个 cron 表达式了吗?打开 Cron 表达式构建器,一次就把调度设置对。