Cron表达式简介
1. 概述
简而言之,cron 是基于 Unix 的系统上可用的基本实用程序。它使用户能够安排任务在指定的日期/时间定期运行。它自然是自动化大量流程运行的好工具,否则需要人工干预。
Cron 作为守护进程运行。这意味着它只需要启动一次,它将继续在后台运行。此过程使用crontab来读取计划的条目并启动任务。
随着时间的推移,cron 表达式格式被广泛采用,许多其他程序和库都在使用它。
2. 使用crontab
cron计划是一个简单的文本文件,位于Linux 系统上的*/var/spool/cron/crontabs下。**我们不能直接编辑crontab文件**,所以我们需要使用crontab*命令来访问它。
要打开crontab文件,我们需要触发以下命令:
crontab -e
crontab中的每一行都是一个条目,其中包含一个表达式和一个要运行的命令:
* * * * * /usr/local/ispconfig/server/server.sh
此条目每分钟运行一次上述脚本。
3. Cron 表达式
让我们理解cron表达式。
它由五个字段组成:
<minute> <hour> <day-of-month> <month> <day-of-week> <command>
3.1.表达式中的特殊字符
-
* (all) —— 指定每个时间单位都应该发生事件。例如,<minute>字段中的“*”表示“每分钟”。
-
? (any) —— 在 < day-of-month> 和 <day-of-week> 字段中用于表示任意值,因此忽略字段值。例如,如果我们想在“每月 5 日”触发脚本,而不管该日期是一周中的哪一天,我们指定一个“?” 在 < day-of-week> 字段中。
-
–(range) —— 确定值范围。例如,<hour>字段中的“10-11”表示“第 10 小时和第 11 小时”。
-
, (values) —— 指定多个值。例如,<day-of-week>字段中的“MON, WED, FRI”表示“星期一、星期三和星期五”。
-
/(increments) —— 指定增量值。例如,<minute>字段中的“5/15”表示“一小时的 5、20、35 和 50 分钟”。
-
L(last) —— 在不同领域使用时有不同的含义。例如,如果应用在<day-of-month>字段中,则表示该月的最后一天,即“1 月31 日”,依此类推。它可以与偏移值一起使用,例如“L-3”,表示“日历月的倒数第三天”。在 < day-of-week>中,它指定“一周的最后一天”。它也可以与 <day-of-week> 中的另一个值一起使用,例如“6L”,表示“上周五”。
-
W(weekday) —— 确定最接近一个月中给定日期的工作日(星期一到星期五)。例如,如果我们在 <day-of-month> 字段中指定“10W”,则表示“接近该月 10 日的工作日”。因此,如果“10th”是星期六,作业将在“9th”触发,如果“10th”是星期日,它将在“11th”触发。如果我们在 <day-of-month>中指定“1W” ,如果“1st”是星期六,则作业将在“3rd”即星期一触发,并且不会跳回到上个月。
-
# —— 指定该月某个工作日的“N-th”出现,例如“本月的第三个星期五”可以表示为“6#3”。
3.2. Cron 表达式示例
让我们看一些使用字段和特殊字符组合的cron表达式示例:
每天中午 12:00(中午):
0 12 * * ?
每五分钟从下午 1 点开始,到下午 1:55 结束,然后从下午 6 点开始,到下午 6:55 结束,每天:
0/5 13,18 * * ?
每天从下午 1 点开始到下午 1:05 结束的每一分钟:
0-5 13 * * ?
6 月每周二下午 1:15 和 1:45:
15,45 13 ? 6 Tue
每周一、周二、周三、周四和周五上午 9:30:
30 9 ? * MON-FRI
每月 15 日上午 9 点 30 分:
30 9 15 * ?
每月最后一天下午 6 点:
0 18 L * ?
每个月的第三天到最后一天下午六点:
0 18 L-3 * ?
每月最后一个星期四上午 10:30:
30 10 ? * 5L
每月第三个星期一上午 10 点:
0 10 ? * 2#3
从每月的第 10 天开始,连续五天每天午夜 12 点:
0 0 10/5 * ?
4. Cron 特殊字符串
除了 cron 表达式中指定的字段外,还支持一些特殊的预定义值,我们可以使用它们来代替字段:
- @reboot —— 在启动时运行一次
- @yearly或***@annualy*** —— 每年运行一次
- @monthly —— 每月运行一次
- @weekly —— 每周运行一次
- @daily或***@midnight*** —— 每天运行一次
- @hourly —— 每小时运行一次