什么是 Cron?
Cron 是 Unix/Linux 系统中最常用的任务调度工具,用于在指定时间自动执行命令或脚本。Cron 表达式精确描述了任务的执行时间规则。
Cron 表达式格式
标准格式(5 字段)
┌───── 分钟 (0-59)
│ ┌───── 小时 (0-23)
│ │ ┌───── 日 (1-31)
│ │ │ ┌───── 月 (1-12)
│ │ │ │ ┌───── 星期 (0-7, 0 和 7 都表示周日)
│ │ │ │ │
* * * * *
扩展格式(6 字段,包含秒)
秒 分 时 日 月 星期
特殊字符
| 字符 | 含义 | 示例 |
|---|---|---|
* |
所有值 | * = 每分钟/每小时 |
, |
分隔多个值 | 1,3,5 = 第 1,3,5 |
- |
范围 | 1-5 = 1 到 5 |
/ |
步长 | */5 = 每 5 个 |
L |
最后(仅某些实现) | L = 月份最后一天 |
# |
第 n 个星期几(仅某些实现) | 1#2 = 第二个周一 |
常用示例
| 表达式 | 含义 |
|---|---|
0 3 * * * |
每天凌晨 3:00 |
*/5 * * * * |
每 5 分钟 |
0 9-17 * * 1-5 |
工作日每小时整点(9-17 点) |
0 0 1 * * |
每月 1 号午夜 |
0 0 * * 0 |
每周日午夜 |
30 4 * * 1-5 |
工作日每天早上 4:30 |
0 0 */2 * * |
每隔一天的午夜 |
0 0 * * 1-5 |
工作日午夜 |
*/30 9-18 * * * |
每天 9:00-18:00 每 30 分钟 |
0 0 1 1 * |
每年 1 月 1 日午夜 |
最佳实践
1. 避免高峰时段
大量 Cron 任务默认在整点(0 0 * * *)触发,建议错开时间,如使用 0 3 * * * 替代 0 0 * * *。
2. 使用验证工具
在 crontab.guru 等工具中验证 Cron 表达式的含义,确保与预期一致。
3. 分布式系统注意事项
- 使用分布式锁(如 Redis Lock)防止任务在多个实例上重复执行
- 考虑使用分布式调度框架(如 xxl-job、Quartz Cluster)
4. 时区处理
服务器的 Cron 默认使用系统时区(通常为 UTC),跨境业务需注意时区偏移。
5. 日志记录
始终为 Cron 任务添加日志输出,方便排查执行问题。
常见陷阱
- 星期和日同时设置:当同时指定"日"和"星期"时,满足任一条件即执行(OR 逻辑)
- 时区差异:如果服务器使用 UTC,
0 9 * * *在 UTC 9:00 执行,而非本地时间 9:00 - 夏令时:Cron 在夏令时切换时可能跳过或重复执行某些任务
推荐工具和库
| 语言 | 推荐库 |
|---|---|
| Node.js | node-cron, cron |
| Python | croniter, cron |
| Java | Quartz, spring-task |
| Go | robfig/cron |
| 在线工具 | crontab.guru, crontab-generator.org |