cron
计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 cron 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的任务。cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。
结构 和 参数
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
(1)Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek
==> (秒 分 时 月中日期 月 星期 年)
参数 | 值 | 字符 |
---|---|---|
秒(Seconds) | 0-59取整 | , - * / |
分(Minutes ) | 0-59取整 | , - * / |
时(Hours) | 0-23取整 | , - * / |
日期(DayofMonth) | 1-31取整(但是具体月的日期要考虑) | , - * ? / L W C |
月(Month) | 1-12取整 或者 英文简称 | , - * / |
星期(DayofWeek ) | 1-7取整 或者英文简称 | , - * ? / L C # |
年(可选)(year) | 1970 - 2099 | , - * / |
字符
(1):* 标识匹配该区域的任何值,在秒中时表示每秒都会触发事件。
(2):? 只能在日期(DayofMonth)和星期(DayofWeek)中使用,标识匹配该区域的任何值,但是因为日期 (DayofMonth)和星期(DayofWeek)相互影响。
(3):- 表示范围,例如在分(Minutes)域使用5-10,表示从5分到10分钟每分钟触发一次。
(4):/ 表示起始时间开始触发,然后每隔固定时间触发一次。例如,"0 0 3/5 * * ?"表示每天3点开始执 行,每隔5个小时执行一次,即3点、8点、13点、18点、23点各执行一次;在分(Minutes)域使用5/20,则意味着在5分钟时触发一次,每隔20分钟执行一次,即25,45等分别触发一。
(5):, 表示列出枚举值 例如:在分(Minutes)域使用5,20,则意味着在5和20分每分钟触发一次。
(6):L 表示最后,只能出现在日期(DayofMonth)和星期(DayofWeek)。在星期(DayofWeek)中使用 5L 表示在最后一个星期四执行。
(7):W 表示有效工作日(周一到周五),只能出现在日期DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如日期(DayofMonth)中使用5W ,如果5日是星期六,则在最近的工作日触发,即周五,如果5日是星期天,则在最近的工作日周一触发,如果5日是在星期一到星期五的一天,则在5日触发,并且W寻找最近的一天是不会跨月的。
(8):LW 这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9):# 用于确定每个月第几个星期几,只能出现在DayofMonth域。例:在星期(DayofWeek)字段用"6#3"指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。
举例
表达式 | 含义 |
---|---|
0 0 2 1 * ? * | 表示在每月的1日的凌晨2点触发 |
0 15 10 ? * MON-FRI | 表示周一到周五每天上午10:15触发 |
0 15 10 ? * 6L 2002-2006 | 表示2002-2006年的每个月的最后一个星期五上午10:15触发 |
0 0 10,14,16 * * ? | 每天上午10点,下午2点,4点触发 |
0 0/30 9-17 * * ? | 朝九晚五工作时间内每半小时 |
0 0 12 ? * WED | 表示每个星期三中午12点 |
0 0 12 * * ? | 每天中午12点触发 |
0 15 10 ? * * | 每天上午10:15触发 |
0 15 10 L * ? | 每月的最后一天的上午十点十五触发 |
0 0/5 14,18 * * ? | 在每天下午的两点到六点,准点开始,每五分钟触发一次 |
0 0/30 9-17 * * ? | 朝九晚五,每半小时执行一次,准点开始 |
0 15 10 ? * 6#3 | 每个月第三个星期五的上午十点十五触发 |
0 15 10 * * ? 2019 | 20019年的每天的上午十点十五触发 |
0 0 0 1 1 ? * | 每年的元旦触发 |
0 15 10 L-2 * ? | 每个月的倒数第三天的10:15触发 |
注意事项
有些子表达式能包含一些范围或列表
(1)表达式中的(星期)可以为 “MON-FRI” ,但是* 字符表示所有的日期可能的值。因此 星期(dayofWeek)和日期(dayofMonth)会发生冲突。
(2)"/"字符用来指定数值的增量
在子表达式中的“0/15”表示从0开始每15分钟执行一次。
“3/20”表示 从3开始没20分钟执行一次 它和 3,23,43 含义一样
(3)“?” 字符仅仅被用于日期(dayofMonth)和星期(dayofWeek)中 不需要给定值。但是当一个表达式中被赋了值以后,为了避免冲突,另外一个表达式的值要被设定成 “?”
(4)“L” 字符仅被用于日期(dayofMonth)和星期(dayofWeek)两个表达式,它是单词“last”的缩写 但是它在两个子表达式里的含义是不同的。 在日期(dayofMonth)表达式中,“L”表示一个月的最后一天 在星期(dayofWeek)表达式中,“L”表示一个星期的最后一天,也就是SAT,如果在“L”前有具体的内容,它就具有其他的含义了
例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五 注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
部分内容参考 https://www.cnblogs.com/javahr/p/8318728.html
Cron表达式生成器 https://qqe2.com/cron