🏠 首页 攻略 Cron表达式速查:5分钟掌握定时任务写法

Cron表达式速查:5分钟掌握定时任务写法

Cron表达式到底怎么写?分、时、日、月、周五个字段各代表什么?本文用实例+速查表帮你快速上手,附常见场景模板。

Cron表达式速查:5分钟掌握定时任务写法

你是不是也遇到过这种情况:

同事让你配一个"每天凌晨2点跑备份"的定时任务。你打开 crontab 编辑器,手写了 0 2 * * *,结果发现任务根本没执行。排查半天才发现,服务器上装的是非标准 cron,格式完全不同。

或者你接手了一个旧项目,配置文件里写着 30 4 * * 1-5,你猜它是什么意思?每天凌晨4点半?不对,那是 30 4 * * *。这个表达式其实是"每周一到周五凌晨4:30执行"。

Cron 表达式看着简单,但稍微复杂一点的场景就容易写错。今天这篇,帮你彻底搞懂它。


Cron 表达式的 5 个字段

标准 Cron 表达式由 5 个字段组成,用空格分隔:

┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日 (1 - 31)
│ │ │ ┌───────────── 月 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 7, 0和7都是周日)
│ │ │ │ │
│ │ │ │ │
* * * * *

每个字段的取值范围:

字段取值范围示例
分钟0-5930 表示整点过30分
小时0-232 表示凌晨2点
1-3115 表示每月15号
1-126 表示6月
星期0-7(0和7都是周日)1-5 表示周一到周五

常用特殊字符

Cron 表达式不是只能写死数字,有 4 个特殊字符很好用:

  • * 通配符,表示"每一"。比如 * * * * * 就是每分钟执行一次
  • , 枚举多个值。1,3,5 表示第1、3、5天
  • - 表示范围。1-5 表示从1到5
  • / 表示间隔。*/2 表示每隔2个单位

举个例子:

  • */5 * * * * — 每5分钟执行一次
  • 0 9-18 * * 1-5 — 工作日上午9点到下午6点的整点执行
  • 30 2 1 * * — 每月1号凌晨2:30执行
  • 0 0 1 1,6,12 * — 每年1月、6月、12月的1号零点执行

常见场景速查表

下面这 10 个是最常用的定时任务写法,直接复制就能用:

场景Cron 表达式说明
每分钟执行* * * * *最简单,但也最耗资源
每5分钟执行*/5 * * * *适合轻量级健康检查
每小时执行0 * * * *整点触发
每天凌晨2点0 2 * * *备份、日志轮转常用
每周一早上9点0 9 * * 1周报生成、周数据汇总
每月1号零点0 0 1 * *月度报表、账单生成
每季度最后一天0 0 28-31 * 5注意:这个写法有缺陷,详见下文
工作日凌晨1点0 1 * * 1-5周一到周五,不含周末
每隔3小时0 */3 * * *适合缓存刷新
每年元旦零点0 0 1 1 *年度数据归档

注意:上面的"每季度最后一天"写法其实不准确。28-31 会匹配到2月29日、4月31日(不存在)等无效日期。如果要精确匹配季度末,建议用脚本判断或直接指定 0 0 31 3,6,9,12 *


两个容易踩的坑

坑1:周日到底是0还是7?

标准 Cron 里,周日可以用 07 表示。但有些实现(比如 macOS 的 cron)只认 0,不认 7

如果你想写"每周日和每周一执行",稳妥的写法是 0 0 * * 0,1,而不是 0 0 * * 7,1

坑2:日字段和星期字段不能同时用 *

这是最常见的错误之一。比如你想写"每周一到周五的凌晨2点",有人可能会写成 0 2 * * 1-5,这是对的。

但如果你写成 0 2 * * *,那就是每天凌晨2点,不是每周一到周五。

反过来,0 2 1 * * 是每月1号的凌晨2点,跟星期几没关系。

记住一条规则:当"日"和"星期"两个字段都不是 * 时,Cron 的行为取决于具体实现。有的实现是"或"的关系(满足任一就执行),有的是"与"的关系(必须同时满足)。为了避免混淆,尽量只用一个字段来限定日期。


实战:用 navbox 工具验证你的 Cron 表达式

写 Cron 表达式最怕什么?写完了不知道对不对。

这里推荐两个在线工具:

  1. Cron 表达式生成器 — 可视化点选,自动生成表达式。适合不熟悉语法的同学。选"每天"→“凌晨2点”,它直接输出 0 2 * * *

  2. Cron 表达式解析器 — 输入一个表达式,告诉你下次执行时间。比如输入 30 4 * * 1-5,它会列出接下来 5 次执行的具体日期和时间,帮你确认没写错。

这两个工具配合着用,基本不会出错。


进阶:Windows 任务计划器的区别

如果你的定时任务跑在 Windows 上,用的是任务计划器(Task Scheduler),那 Cron 表达式就不适用了。

Windows 任务计划器有自己的触发器设置界面,虽然也能做到类似的效果,但语法完全不同。比如"每天凌晨2点"在 Windows 上是通过图形界面勾选"每天"、“起始时间 02:00"来实现的。

如果你需要在 Windows 上运行 Cron 风格的定时任务,可以考虑安装 Cygwin 或者 WSL,然后在 WSL 里用标准的 Linux cron。


总结

Cron 表达式不难,关键记住三点:

  1. 五个字段从左到右分别是:分、时、日、月、周
  2. *,-/ 四个特殊字符覆盖 90% 的场景
  3. 不确定表达式对不对?用解析器工具验证一下

最后留个小练习:如果你想让某个任务"每个月的最后一个星期五凌晨3点执行”,Cron 表达式该怎么写?提示:这个没有完美的 Cron 写法,需要用脚本判断。

欢迎在评论区讨论你的答案。