什么是 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