Contents

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 —— 每小时运行一次