一、Cron指令格式及实例
Cron 指令有两种格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek
其中每个字段的含义和取值范围是:
- Seconds:秒(0-59)
- Minutes:分钟(0-59)
- Hours:小时(0-23)
- DayofMonth:一月中的第几天(0-31)
- Month:月份(1-12)
- DayofWeek:一周中的第几天(1-7),即星期,1为星期天,2为星期一,以此类推。
- Year:年份(1970-2099)
赋值可以使用的一些特殊字符:
- 星号( * ):表示该取值范围中的任意值。
- 横杠( - ):表示范围,想要命中的值的范围,比如Hours=20-22表示晚上八点到十点。
- 逗号( , ):表示列举,可以列举出想要命中的值,比如Hours=8,12,18表示8点12点和18点。
- 除法( / ):表示增量,比如Hours=0/2表示从0点开始每两个小时,再比如Minutes=*/30表示从现在开始每三十分钟。
上述字符可以应用于所有字段,还可以进行组合使用,下面列出了一些DayofMonth和DayofWeek会使用的特殊字符:
- ? :表示任意,只能用在DayofMonth和DayofWeek两个字段,因为DayofMonth和DayofWeek会相互影响,当指定其中一个时另一个需要设定为?。比如想在每个月的第一天定时,但是每个月的第一天不一定是星期几,所以DayofWeek只能使用?,反之,想要每周一设定一个定时,那么这一天的日期也是不固定的因此DayofMonth只能使用?。
- #:表示第几个星期几,只能出现在DayofWeek字段。比如DayofWeek=1#2,表示第二个星期天。
- L:表示最后,只能用在DayofWeek和DayofMonth两个字段,比如DayofWeek=5L表示在这个月最后的一个星期四触发。
- W:表示工作日(Week),只能出现在DayofMonth字段,如果指定日期非工作日则在最近的工作日触发事件。比如DayofMonth=1W,如果1日是星期天,那么该事件会在2日(星期一)的指定时间触发。需要注意的是,W的最近寻找不会跨过月份,DayofMonth=31W,如果31日是星期天,那么该事件不会在次月1日(星期一)的指定时间触发,而是在本月的29日(星期五)的指定时间触发。
实际使用时一般我先打上七个星号先进行占位,再把具体的条件添加上去:
* * * * * ? * //每天每时每分每秒
0 0 12 * * ? * //每天中午十二点整触发
0 0 12 1 1 ? * //1月1号中午十二点整触发
0 0 12 1 * ? * //每月1号中午十二点整触发
0 0 12 1W * ? * //每月1号中午十二点整触发,如果1号不是工作日就在本月最近的工作日的十二点整触发
0 0 12 ? * 2 //每周一中午十二点整触发
0 0 12 ? * 2L //每个月的最后一个周一的中午十二点整触发
0 0 12 ? * 1LW //离每个月的最后一个星期天最近的一个本月的工作日的中午十二点整触发
0 0 12 ? * 1#2 //每月的第二个星期天的中午十二点整触发
0 0 12 ? * 1 2022 //2022年的每周一中午十二点整触发
0 0/30 12-14 * * ? * //每天下午12点到14点之间,每隔半小时触发一次
0 */30 12-14 * * ? * //每天下午12点到14点之间,每隔半小时触发一次
0 30/5 12 * * ? * //每天中午12点半到12点55之间,每隔5分钟触发一次
0 0-30/5 12 * * ? * //每天中午12点整到12点半之间,每隔5分钟触发一次
0 0 8,12,18 * * ? * //每天8点整,12点整,18点整触发
0 0 8,12,18 ? * 2-6 * //每周一到周五8点整,12点整,18点整触发
* 0 8 * * ? * //每天8:00:00到8:00:59之间每秒钟触发一次
*/10 0 8 * * ? * //每天8:00:00到8:00:59之间每10秒钟触发一次
30/10 0 8 * * ? * //每天8:00:30到8:00:59之间每10秒钟触发一次
二、crond
在Linux上使用crontab指令进行任务定时,crond时crontab的守护进程,对crond服务进行控制。
/sbin/service crond start // 启动服务
/sbin/service crond stop // 关闭服务
/sbin/service crond restart // 重启服务
/sbin/service crond reload // 重新载入配置
三、crontab
crontab 指令格式:
Minutes Hours DayofMonth Month DayofWeek Command
- Minutes:分钟(0-59)
- Hours:小时(0-23)
- DayofMonth:一月中的第几天(0-31)
- Month:月份(1-12)
- DayofWeek:一周中的第几天(0-7),即星期,0和7为星期天,1为星期一,以此类推。
- Command:要执行的指令。
表达式中仅可使用( * )( - )( , )( / )四种字符,使用方式同cron。
crontab 指令参数:
-u <user> define user //指定用户
-e edit user's crontab //添加用户定时任务
-l list user's crontab //查看用户定时任务
-r delete user's crontab //删除用户定时任务
-i prompt before deleting //删除前提示
-n <host> set host in cluster to run user's crontab //设置主机以运行用户的定时任务
-c get host in cluster to run user's crontab //获取运行用户的定时任务的主机
-s selinux context
-x <mask> enable debugging
实例:
[root@test_node1 ~]# crontab -e -u Lily
0 8,12,18 * * * logger “Test crontab”
[root@test_node1 ~]# crontab -e -l Lily
0 8,12,18 * * * logger “Test crontab”
四、Jenkins中的cron
先给从Jenkins跳转过来的小伙伴们粘一下官方的说明,时区的列表太长,暂且省略,常用的就是格林威治时间也就是0时区:Etc/GMT,还有北京时间:Asia/Shanghai,需要注意的是在定时触发处声明的时区仅用于该构建,关于时区的设定和修改可以参考jenkins时区变更。
简单来说Jenkins中cron和crontab的区别仅在于没有Command指令,另外在Jenkins中提供了一个特殊的符号:H,下面主要对这个符号的使用进行说明。
符号H可以用于任何字段,这个符号对于Jenkins而言具有特殊的含义,它告诉Jenkins,在一个范围内使用该项目的项目名的散列值计算出一个唯一的偏移量,这个偏移量与范围的最小值相加之后作为项目的实际执行时间。
- 使用这个符号的目的是避免所有配置相同的cron值的项目在同一时间启动,这个偏移量是项目名的散列值,每一个项目的项目名都是不同的,因此每一个偏移量也都是与其他项目不同的,因此可以做到不同的项目在相同的设定下可以有不同的启动时间。某种程度上而言H符号是某个范围上的随机值,但是因为它的值实际上是项目名的散列值,并不是一个完全的随机数,因此对于一个给定的项目,这个值是保持稳定的。
- 使用H表示一个月中的第几天时需要注意的是,由于每个月天数不同,散列值在取值时无法进行月份的判断,因此只在1-28的范围内选取,所以同样是表示每三天执行一次,但是在实际执行的时候*/3和H/3在月末的时候是有差别的。
- 另外Jenkins中还存在一些比较方便的别名:@yearly,@annually,@monthly,@weekly,@daily,@midnight,@hourly。使用这些别名相当于使用了一个散列,比如@hourly相当于H * * * * ,表示每小时中的某一时刻执行一次,@midnight相当于H H(0-3) * * * ,表示每天0-3点之间某一时刻执行一次。