Cron

181 阅读4分钟

Cron表达式是一种字符串,表示定时任务的执行周期和频率,Cron处理程序会根据这个表达式计算出下一次任务应该执行的时间点,在任务执行之后,Cron服务会再次计算下一次任务应该执行的时间点。这个过程会一直重复

这玩意跟正则表达式一样,本人学了无数次,但每次都会忘,用到的时候又再去临时学习

Cron格式

Cron表达式包含了6个或7个字段,每个字段代表不同的时间类型,字段间以空格分割

7个字段的Cron是完整格式

Seconds Minutes Hours DayofMonth Month DayofWeek Year

Year字段可以被省略,于是就有了6个字段的Cron

Seconds Minutes Hours DayofMonth Month DayofWeek

含义如下:

  • Seconds:秒,可出现, - * /四个字符,有效范围为0-59的整数
  • Minutes:分钟,可出现, - * /四个字符,有效范围为0-59的整数
  • Hours:小时,可出现, - * /四个字符,有效范围为0-23的整数
  • DayofMonth:每月的日期,可出现, - * / ? L W C八个字符,有效范围为0-31的整数
  • Month:月份,可出现, - * /四个字符,有效范围为1-12的整数或JAN-DEc
  • DayofWeek:每周的星期,可出现, - * / ? L C #八个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
  • Year:年份,可出现, - * /四个字符,有效范围为1970-2099年

注意:DayofMonth和DayofWeek会相互影响

Cron字段

每个字段都使用数字表示精确的时间节点,也可以出现特殊字符,表示频率、时间范围或者通配符

  • 10:一个精确的数字,假如在Minutes使用10,表示在第10分钟触发任务,其他数字同理

  • *:表示匹配该字段的任意值,假如在Minutes使用*,则表示每分钟都会触发任务

  • ?:代表不指定值。这个符号只能用在日期和星期字段中,表示"我不关心这个字段的值"

    比如想在每个月的1号触发任务,而不关心这个1号是星期几,则可以有如下写法:

    3 13 15 1 * ?

  • -:表示时间范围,例如在Minutes使用5-20,表示在第5到第20分钟期间,每分钟触发一次任务

  • ,:表示枚举值,例如在Minutes使用5,20,表示在第5分钟和第20分钟各触发一次,共触发两次

  • /:表示执行频率,例如在Minutes使用5/20,表示在第5分钟执行一次,后面每20分钟各执行一次,即在第5、25、45执行一次,共3次

  • L:表示最后,用于日期和星期,用在日期时表示一个月的最后一天;用在星期时表示一个月的最后一周,此时需要与数字搭配,比如1L表示一个月的最后一个周日

  • W:表示最近的工作日(周一到周五),只能用于日期字段,例如,15W表示"最接近每月15日的工作日"

    LW可以搭配使用,比如LW表示每月的最后一个工作日

  • #:表示第几个周几,仅在星期字段中使用,例如,2#3表示每个月的第三个周一(2表示周一,3表示第三个)

*?的区别:

语义不同。?用于避免与其他字段的冲突,确保调度的唯一性和清晰性

我们知道DayofMonth和DayofWeek这两字段可能会发生冲突,当其中一个字段指定了值后,另一个一般都要使用?来避免冲突

Cron示例

下面演示几个常用的Cron表达式

  1. 每天中午12:00:00执行

    0 0 12 * * ?
    
  2. 每个月的最后一个星期五上午10:15:10执行

    10 15 10 ? * 6L
    
    
  3. 每天下午14:00:00到14:55:00期间,每隔5分钟执行一次

    0 0/5 14 * * ?
    
  4. 每个月的第1天和接下来的每5天中午12:00:00执行(即,1日、6日、11日等

    0 0 12 1/5 * ?
    
  5. 每年1月、2月和3月的每天中午12:00:00执行

    0 0 12 * JAN,FEB,MAR ?
    
  6. 2024年的每个月的第一个星期一中午12:00:00执行

    0 0 12 ? * 2#1 2024
    
    
  7. 朝九晚五工作时间内每半小时执行一次

    0 0/30 9-17 * * ?
    
  8. 每月的最后一个星期五上午10:15:30执行

    30 15 10 ? * 6L