1. 概述

简单来说,cron 是 Unix 系统中的一个基础工具。它允许用户在指定时间周期性地自动执行任务,是自动化流程的利器,能省去大量人工干预。

cron 以守护进程(daemon)形式运行,只需启动一次就会在后台持续工作。它通过读取 crontab 文件中的调度条目,在指定时间触发任务执行。

随着时间推移,cron 表达式格式被广泛采用,许多其他程序和库也集成了这种调度语法。

2. Cron 表达式

cron 表达式由五个字段组成:

<分钟> <小时> <日> <月> <星期> <命令>

接下来先看常用 cron 表达式示例,再深入解析特殊字符。

2.1. Cron 表达式示例

为方便对比,用表格整理常见场景:

Cron 表达式 说明(24小时制)
0 12 * * ? 每天 12:00 执行
0/15 0 * * ? 每天每 15 分钟执行一次
1/2 0 * * ? 每天所有奇数分钟执行(1,3,5...)
0/5 13,18 * * ? 每天 13:00-13:55 和 18:00-18:55,每 5 分钟执行一次
0-5 13 * * ? 每天 13:00 到 13:05,每分钟执行一次
15,45 13 ? 6 Tue 每年 6 月的每个周二,13:15 和 13:45 执行
30 9 ? * MON-FRI 每周一至周五,09:30 执行
30 9 15 * ? 每月 15 日 09:30 执行
0 18 L * ? 每月最后一天 18:00 执行
0 18 L-3 * ? 每月倒数第三天 18:00 执行
30 10 ? * 5L 每月最后一个周四 10:30 执行
0 10 ? * 2#3 每月第三个周一 10:00 执行
0 0 10/5 * ? 每月从 10 日开始,每 5 天执行一次(10,15,20...)

上述示例用到了 *?-L 等特殊字符,下面详细说明。

2.2. Cron 表达式特殊字符

特殊字符总结如下:

符号 说明 示例
* 匹配该字段所有可能值 <分钟> 字段的 * 表示“每分钟”
? 仅用于 <日><星期> 字段,表示不指定值 <星期> 字段的 ? 表示“任意星期几”
- 定义范围 <小时> 字段的 10-15 表示“10点到15点”
, 指定多个值 <星期> 字段的 MON,WED,FRI 表示“周一、三、五”
/ 定义增量 <分钟> 字段的 5/15 表示“5,20,35,50分钟”
L 用于 <日><星期> 字段:
<日> 字段:表示月末最后一天
<星期> 字段:表示当月最后一个指定星期
• 支持偏移量(如 L-3
<日> 字段的 L:每月最后一天(1月31日,2月28/29日)
<日> 字段的 L-3:每月倒数第三天
<星期> 字段的 5L:每月最后一个周五
W 仅用于 <日> 字段,指定最近的工作日(周一至周五) <日> 字段的 10W
• 若 10 日是周六 → 执行 9 日(周五)
• 若 10 日是周日 → 执行 11 日(周一)
• 若 10 日是工作日 → 执行 10 日
# 指定每月第几个星期几(格式:星期#序号) <星期> 字段的 5#3:每月第三个周五
<星期> 字段的 1#2:每月第二个周一

这些特殊字符让 cron 表达式变得极其灵活。

3. Cron 特殊字符串

除了标准字段,还支持预定义的特殊字符串:

字符串 说明
@reboot 系统启动时运行一次
@yearly 每年运行一次
@monthly 每月运行一次
@weekly 每周运行一次
@daily 每天运行一次
@hourly 每小时运行一次

⚠️ @yearly@annually 等价,@daily@midnight 等价。

4. 使用 Crontab

在 Linux 系统中,cron 调度配置文件位于 /var/spool/cron/crontabs切勿直接编辑该文件,需通过以下命令操作:

crontab -e

这会打开编辑器修改配置。每行一个条目,格式为:

* * * * * /usr/local/ispconfig/server/server.sh

此示例表示每分钟执行一次指定脚本。

5. 总结

本文系统介绍了 cron 表达式和 crontab 的核心概念。通过示例和特殊字符解析,相信你已掌握如何灵活配置定时任务。实际工作中可直接套用这些模式,稍作修改即可满足复杂调度需求。


原始标题:A Guide To Cron Expressions | Baeldung