当前位置:首页 > 系统 > 正文内容

详解定时任务中的 cron 表达式

ym02301年前 (2023-05-09)系统1004

1.前言

我们经常使用 cron 表达式来定义定时任务的执行策略,今天我们就总结一下 cron 表达式的一些相关知识。

cron表达式

cron表达式即计划任务,约定任务在特定的时间执行,有5位、6位、7位之分,不同位数之间以空格分隔。


位数含义

5位:* * * * *        分、时、天、月、周

6位:* * * * * *     秒、分、时、天、月、周

7位:* * * * * * *   秒、分、时、天、月、周、年

tips:大部分情况下会省略年这一位,成为6位,再省略秒,就成为5位。

linux系统中的crontab的表达式只有5位。

2. cron 表达式的定义

cron 表达式是一个字符串,该字符串由 6 个空格分为 7 个域,每一个域代表一个时间含义。 格式如下:

 [秒] [分] [时] [日] [月] [周] [年]

通常定义 “年” 的部分可以省略,实际常用的由 前六部分组成

2.1 cron各部定义

关于 cron 的各个域的定义如下表格所示:

是否必填值以及范围通配符
0-59, - * /
0-59, - * /
0-23, - * /
1-31, - * ? / L W
1-12 或 JAN-DEC, - * /
1-7 或 SUN-SAT, - * ? / L #
1970-2099, - * /

上面列表中值范围还是比较好理解的,但是比较令开发者难以理解的就是通配符,其实 cron 表达式的难点也在于通配符。我们在下一个章节进行说明

2.2 cron中的通配符

  • , 这里指的是在两个以上的时间点中都执行,如果我们在 “分” 这个域中定义为 8,12,35 ,则表示分别在第8分,第12分 第35分执行该定时任务。

  • - 这个比较好理解就是指定在某个域的连续范围,如果我们在 “时” 这个域中定义 1-6,则表示在1到6点之间每小时都触发一次,用 , 表示 1,2,3,4,5,6

  • * 表示所有值,可解读为 “每”。 如果在“日”这个域中设置 *,表示每一天都会触发。

  • ? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的8号触发一个操作,但不关心是周几,我们可以这么设置 0 0 0 8 * ?

  • / 在某个域上周期性触发,该符号将其所在域中的表达式分为两个部分,其中第一部分是起始值,除了秒以外都会降低一个单位,比如 在 “秒” 上定义 5/10 表示从 第 5 秒开始 每 10 秒执行一次,而在 “分” 上则表示从 第 5 秒开始 每 10 分钟执行一次。

  • L 表示英文中的LAST 的意思,只能在 “日”和“周”中使用。在“日”中设置,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年), 在“周”上表示周六,相当于”7”或”SAT”。如果在”L”前加上数字,则表示该数据的最后一个。例如在“周”上设置”7L”这样的格式,则表示“本月最后一个周六”

  • W 表示离指定日期的最近那个工作日(周一至周五)触发,只能在 “日” 中使用且只能用在具体的数字之后。若在“日”上置”15W”,表示离每月15号最近的那个工作日触发。假如15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果是 “1W” 就只能往本月的下一个最近的工作日推不能跨月往上一个月推。

  • # 表示每月的第几个周几,只能作用于 “周” 上。例如 ”2#3” 表示在每月的第三个周二。

3. 示例

下面给出一些示例,可根据上面的解释进行练习解读:

  • 每隔1分钟执行一次:0 */1 * * * ?

  • 每天22点执行一次:0 0 22 * * ?

  • 每月1号凌晨1点执行一次:0 0 1 1 * ?

  • 每月最后一天23点执行一次:0 0 23 L * ?

  • 每周周六凌晨3点实行一次:0 0 3 ? * L

  • 在24分、30分执行一次:0 24,30 * * * ?

4. 总结

今天总结了 cron 表达式,希望对你日常开发有所帮助。其实我们还可以借助于一些可视化的工具来生成 cron 表达式,但是如果我们同样需要能够看得懂别人写的表达式。多多关注!


扫描二维码推送至手机访问。

版权声明:本文由嘉睿博客发布,如需转载请注明出处。

本文链接:https://tius.cc/?id=26

分享给朋友:

“详解定时任务中的 cron 表达式” 的相关文章

CentOS 6 时间,时区,设置修改及时间同步

CentOS 6 时间,时区,设置修改及时间同步

一、时区显示时区date --help 获取帮助date -Rdate +%z上面两个命令都可[root@localhost ~]# date -R; date +%zFri, 19 Oct 2012 23:34:27 +0800+0800主要就是后面的+0800,东八区修改时区cp /usr/sh...

如何从命令行关闭或重启远程 Linux 主机?

如何从命令行关闭或重启远程 Linux 主机?

在远程管理 Linux 主机时,有时需要通过命令行关闭或重启主机。本文将详细介绍如何使用命令行在远程 Linux 主机上执行关闭或重启操作,以确保安全和便捷地管理远程系统。1. 远程连接到 Linux 主机在执行关闭或重启操作之前,首先需要通过 SSH(Secure Shell)或其他远程连接方式连...

freenas(truenas)下挂载win7的共享文件夹

freenas(truenas)下挂载win7的共享文件夹

用户有奇特需求,需要nas挂载他的移动笔记本备份数据,我知道这很不合理,因为反过来用他的移动笔记本访问NAS就可以的了,但他非要返过来,没办法,只能在nas系统里建立个挂载目录,然后用mount_smbfs命令来挂截。前期需要的设置:(1)Windows 7系统增加一个用于访问共享目录权限的账号和密...

LINUX BIOS linux 修改bios时间

LINUX BIOS linux 修改bios时间

    linux系统时间有两个,一个是硬件时间,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时间,是linux系统Kernel时间。当Linux启动时,系统Kernel会去读取硬件时钟的设置,然后系统时钟就会独立于硬件运作。有时我们会发现系统时钟和硬件时钟...

timedatectl详解

timedatectl详解

一、timedatectl输出解析1.Local time本地时间,初始值来自于RTC,由内核维护,系统启动之后和RTC就没有关系,通常等于RTC+时区值(如上图的本地时间=RTC+8)2.Universal time系统时间永远是UTC,在应用程序使用的时候转换为本地时间3.RTC(real-ti...

一条命令永久激活 Windows 及 Office 重装自动激活

一条命令永久激活 Windows 及 Office 重装自动激活

采用硬件激活的方式,重装系统之后,联网也会自动激活激活方式可选硬件永久激活 WindowsOhook 永久激活 OfficeKMS 激活 Windows 至 2038 年KMS 激活 180 天当然这么厉害的工具,一定给大家找到出处。Github 上的开源项目 Microsoft-Acti...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。