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 的核心概念。通过示例和特殊字符解析,相信你已掌握如何灵活配置定时任务。实际工作中可直接套用这些模式,稍作修改即可满足复杂调度需求。