定时任务完全指南:Cron 表达式从入门到避坑¶
Cron 是什么¶
Cron 是类 Unix 系统内置的任务调度器,让系统按照预定时间周期性地执行命令或脚本。服务器上的日志切割、数据备份、证书续期、报表生成,都靠它运转。
一、Cron 表达式的五个字段¶
分 时 日 月 周
* * * * * command
| 字段 | 取值范围 | 说明 |
|---|---|---|
| 分 | 0-59 | 每小时的第几分钟 |
| 时 | 0-23 | 每天的第几小时 |
| 日 | 1-31 | 每月的第几天 |
| 月 | 1-12 | 每年的第几个月 |
| 周 | 0-7 | 每周的星期几(0 和 7 都是周日) |
特殊符号¶
* 任意值
*/5 每 5 个单位
1,15 指定多个值(1 和 15)
1-5 范围(1 到 5)
1-5/2 范围加步长(1,3,5)
二、常用表达式速查¶
*/5 * * * * 每 5 分钟
0 * * * * 每小时整点
30 2 * * * 每天 2:30
0 9 * * 1 每周一 9:00
0 0 1 * * 每月 1 号 0:00
0 3 1 1 * 每年 1 月 1 日 3:00
0 0-23/2 * * * 每两小时(偶数点)
三、最容易踩的坑¶
坑 1:星期和日期同时设置¶
0 9 1 * 5
这是"每月 1 号 9 点"并且"每周五 9 点"(OR 关系),不是 AND。很多人以为它是"每月 1 号且恰好是周五"。如果需要 AND 语义,用两个表达式或加条件判断。
坑 2:时区问题¶
服务器时区不是 Asia/Shanghai 时,cron 按服务器本地时间执行:
# 查看系统时区
timedatectl
# 或
date +%Z
# 修正
sudo timedatectl set-timezone Asia/Shanghai
Docker 容器里跑 cron 尤其容易踩:容器默认 UTC 时区,定时任务会"晚 8 小时"执行。
ENV TZ=Asia/Shanghai
坑 3:环境变量缺失¶
cron 的执行环境是精简的,PATH 只有 /usr/bin:/bin,很多命令(如 node、python)找不到:
# 错误:node 不在 PATH 里
*/10 * * * * node /opt/script.js
# 正确:写全路径
*/10 * * * * /usr/local/bin/node /opt/script.js
# 或者先 source 环境
*/10 * * * * . /etc/profile && node /opt/script.js
坑 4:分钟粒度的"每 X 分钟"含义¶
*/15 * * * *
这是"每小时的第 0、15、30、45 分"执行。注意与"从任务开始每 15 分钟"不同——cron 没有"相对任务开始时间"的概念。
四、日志与调试¶
# 查看 cron 服务状态
systemctl status cron
# 查看当前用户的所有任务
crontab -l
# 编辑任务
crontab -e
# 任务执行日志(Debian/Ubuntu)
grep CRON /var/log/syslog
# 重定向输出,方便排查
*/5 * * * * /opt/script.sh >> /var/log/script.log 2>&1
排查定时任务第一件事:确认任务真的被调度了(看 syslog),再确认脚本本身能跑(手动执行一次)。
五、企业级调度:别只用系统 cron¶
系统 cron 适合单机、简单任务。复杂场景需要更强工具:
| 场景 | 推荐 |
|---|---|
| 单机简单任务 | 系统 cron / crontab |
| Web 管理界面 | 青龙面板、Azkaban |
| 分布式任务 | XXL-Job、Apache Airflow |
| 延迟任务/消息队列 | 延迟队列、Redis ZSet、MQ 延迟消息 |
XXL-Job 的设计要点¶
- 调度中心与执行器分离:调度中心只管发指令,执行器在业务机器上
- 失败重试:支持指数退避重试
- 路由策略:第一个/轮询/故障转移
- 分片广播:大数据任务按分片并行执行
六、设计定时任务的最佳实践¶
- 任务幂等:重复执行结果一致,才敢放心重试
- 任务可监控:成功失败都有日志和告警,失败要通知到人
- 错峰调度:大任务避开业务高峰,多个任务之间留间隔
- 随机延迟:批量机器同时执行时加随机延时,避免"惊群效应"
- 预留执行时间:任务执行时间不能超过调度间隔,否则任务会堆积
七、常见需求速查¶
# 每月最后一天执行(0 0 L * *,注意这是 Quartz 语法)
0 0 L * * command
# 工作日 9-18 点每小时
0 9-18 * * 1-5
# 每天 6:00 和 18:00
0 6,18 * * *
结语¶
Cron 语法本身五分钟就能学会,真正的坑都在工程实践里:时区、环境变量、幂等性、可观测性。把文中这些坑记在心里,你的定时任务会少踩 90% 的雷。