反馈

Crontab 语法详解:五段时间表达式怎么写

Linux 定时任务的核心是一行看起来很神秘的表达式,比如 0 2 * * 1-5。拆开来看,它只是把"什么时候执行"这个问题,拆成五个独立的时间字段分别描述。


目录

  1. 五段结构:分 时 日 月 周
  2. 常用符号:* , - /
  3. 日和周的特殊规则:或关系
  4. 常见表达式示例

1. 五段结构:分 时 日 月 周

标准 crontab 表达式由五个字段组成,从左到右依次是:

分钟  小时  日期(月中第几天)  月份  星期
0-59  0-23  1-31            1-12  0-7(0和7都表示周日)

每个字段独立描述"这个时间维度上,什么时候该触发",五个字段必须同时满足才会真正执行(除了日和周之间有特殊的"或"关系,见第 3 节)。有些实现(比如某些云平台的定时任务)会在最前面加一个"秒"字段,变成 6 段,但标准 Linux cron 用的是 5 段。

2. 常用符号:* , - /

符号 含义 示例
* 该字段的任意值都满足(不限制) * * * * * 表示每分钟都执行
, 列出多个具体值 0,30 * * * * 表示每小时的第 0 分和第 30 分
- 表示一个连续范围 1-5 表示周一到周五
/ 表示步长(每隔多少触发一次) */15 * * * * 表示每 15 分钟一次(第 0、15、30、45 分)

这几个符号可以组合使用,比如 0 9-18/2 * * 1-5 表示"周一到周五,从 9 点到 18 点之间,每隔 2 小时的整点执行一次"。

3. 日和周的特殊规则:或关系

前面提到"五个字段必须同时满足",但"日期"和"星期"这两个字段之间是例外——它们之间是的关系,不是"且"。也就是说,如果日期和星期字段都不是 *(都指定了具体条件),那么只要满足其中一个条件就会触发,不需要两个都满足。

举个例子:0 0 15 * 1 表示"每月 15 号,或者每周一,只要满足其中一条,午夜 0 点就执行"——而不是"必须同时是 15 号又是周一"。这个规则很反直觉,也是新手写 crontab 表达式最容易搞错的地方。如果只想按"日期"或只想按"星期"其中一种条件触发,通常的做法是把另一个字段设成 *,避免意外触发。

4. 常见表达式示例

表达式 含义
0 2 * * * 每天凌晨 2 点执行
*/5 * * * * 每 5 分钟执行一次
0 9 * * 1-5 周一到周五每天 9 点执行
0 0 1 * * 每月 1 号午夜执行
30 8 1,15 * * 每月 1 号和 15 号的 8:30 执行

排查 crontab 表达式最容易出错的地方,往往不是符号语法本身,而是"日和周的或关系"以及"步长从哪个数字开始算"这两个细节——写完之后拿工具推演一遍未来几次实际触发的时间点,比纯靠肉眼读表达式更可靠。


在线工具:crontab执行时间计算