本我 · 加载中...

文章背景图

定时任务完全指南:Cron 表达式从入门到避坑

2026-08-06
0
-
- 分钟
|

定时任务完全指南: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 的设计要点

  • 调度中心与执行器分离:调度中心只管发指令,执行器在业务机器上
  • 失败重试:支持指数退避重试
  • 路由策略:第一个/轮询/故障转移
  • 分片广播:大数据任务按分片并行执行

六、设计定时任务的最佳实践

  1. 任务幂等:重复执行结果一致,才敢放心重试
  2. 任务可监控:成功失败都有日志和告警,失败要通知到人
  3. 错峰调度:大任务避开业务高峰,多个任务之间留间隔
  4. 随机延迟:批量机器同时执行时加随机延时,避免"惊群效应"
  5. 预留执行时间:任务执行时间不能超过调度间隔,否则任务会堆积

七、常见需求速查

# 每月最后一天执行(0 0 L * *,注意这是 Quartz 语法)
0 0 L * * command

# 工作日 9-18 点每小时
0 9-18 * * 1-5

# 每天 6:00 和 18:00
0 6,18 * * *

结语

Cron 语法本身五分钟就能学会,真正的坑都在工程实践里:时区、环境变量、幂等性、可观测性。把文中这些坑记在心里,你的定时任务会少踩 90% 的雷。

原创

定时任务完全指南:Cron 表达式从入门到避坑

本文链接: 定时任务完全指南:Cron 表达式从入门到避坑

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本文为原创文章,转载请联系作者并注明出处。

评论交流

文章目录