定时任务是我们日常开发中经常用到的一个功能点,无论是Linux服务器上Crontab还是Spring task schedule,都会使用到cron表达式去实现定时任务的配置。不过,一定要注意,Linux cron表达式和Spring的cron表达式不一样,下面来一次讲清楚。
一,Linux cron表达式
1,长度: 5 位 (中间有一个空格)
2,字段含义和取值
分 时 天 月 周
在以上各个字段中,还可以使用以下特殊字符:
- "*"代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月;
- "/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。
- "-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。
- ","分散的数字(不一定连续),如1,2,3,4,7,9。
- cron默认每1分钟扫描一次,全为*即为每分钟一次
- 月字段还可以为字母L,表示每月最后一天
注:由于各个地方每周第一天不一样,因此Sunday=0(第一天)或Sunday=7(最后1天)。
3,示例
示例:
每一分钟执行一次command(因cron默认每1分钟扫描一次,因此全为*即可)
* * * * * command每小时的第3和第15分钟执行command
3,15 * * * * command每天上午8-11点的第3和15分钟执行command:
3,15 8-11 * * * command每隔2天的上午8-11点的第3和15分钟执行command:
3,15 8-11 */2 * * command每个星期一的上午8点到11点的第3和第15分钟执行command
3,15 8-11 * * 1 command每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart每一小时重启smb
* */1 * * * /etc/init.d/smb restart晚上11点到早上7点之间,每隔一小时重启smb
* 23-7/1 * * * /etc/init.d/smb restart每月的4号与每周一到周三的11点重启smb
0 11 4 * mon-wed /etc/init.d/smb restart每小时执行/etc/cron.hourly目录内的脚本
0 */1 * * * root run-parts /etc/cron.hourly
二,Spring cron表达式
1,长度:6 位 (中间有一个空格)
2,字段含义和取值
秒 分 时 天 月 周
注意: 和Linux cron的区别就是多一个秒的配置
-
字段可能是一个星号*,它表示该字段可以使用的所有范围。对于周或天字段,可以使用问号(?)代替星号
-
","分散的数字(不一定连续),如1,2,3,4,7,9
-
"-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次
-
"/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。
-
周字段和月字段可以是英文名(Monday,Friday,May,October这些),取前三个字母,忽略大小写
-
天字段可以是L,表示月的最后一天; 如果是L-1,表示月的倒数第二天
-
周字段也可以是L,表示周的最后一天
-
周字段可以使nL,表示每月最后的周n
-
天字段可以是nW,表示每个月的第n周
-
天字段可以是LW,表示每个月的最后的一周
-
周字段可以是d#n,表示一个月的第n周的第d天
3,示例
0 0 * * * *
每天的零时零分
*/10 * * * * *
每10秒
0 0 8-10 * * *
每天8点,9点,10点
0 0 6,19 * * *
每天6点正和19点正
0 0/30 8-10 * * *
每天8:00, 8:30, 9:00, 9:30, 10:00, 10:30
0 0 9-17 * * MON-FRI
周一到周五的9点到17点
0 0 0 25 DEC ?
圣诞夜零时
0 0 0 L * *
每个月最后一天零时
0 0 0 L-3 * *
每月倒数第4天零时
0 0 0 * * 5L
每月最后的周五零时
0 0 0 * * THUL
每月最后的周四零时
0 0 0 1W * *
每月第一周的零时
0 0 0 LW * *
每月最后一周的零时
0 0 0 ? * 5#2
每个月的第二周的周五的午夜零时
0 0 0 ? * MON#1
每个月的第一个周一的午夜零时
4,注解用法
上面这些示例,都是在注解@Scheduled(cron = "0 0 0 LW * *")
中使用,还有一些快捷的方式,用法如:
@Scheduled(cron = "@hourly")
@yearly
(or@annually
)
0 0 0 1 1 *
@monthly
0 0 0 1 * *
@weekly
0 0 0 * * 0
@daily
(or@midnight
)
0 0 0 * * *
@hourly
0 0 * * * *
码字不易,记得点赞关注哟