corn表达式
熟悉Linux或者后端开发的同学一定都遇到过执行定时任务的需求,其实不管是Linux下的corntab命令,还是Spring下@Scheduled注解,亦或是Quartz以及其他语言中的定时任务框架,都使用的是类似corn语法的表达式,所以了解corn表达式的语法是很有必要的。
在了解了corn的表达式语法后可以做些什么:
- Linux,树莓派,软路由通过配置corntab来执行shell用以定时备份数据库,如果你对抓包很熟悉,你就可以通过抓包来实现某些网站的定时自动签到,我最近就有写PT站自动签到的计划。
- 在使用Spring的@Scheduled注解,Quartz,或是其他语言的定时任务框架时,就是小Case了。
我用corn做了什么:
- 最近我负责的后端项目,有一个需求是定时去请求某个接口获取数据,然后再进行统计分析。
- 由于我在大学提供的办公室里上班,没有拉宽带的权限,所以只能使用校园网的Portal认证来上网,但是电脑上登录了账号,手机就不能再登录了;前后端联调的时候也无法通过路由器组建局域网,每天上班第一件事都是登录网页认证这个事我自然无法忍受,所以我写了一个shell脚本自动验证,这样只要执行下脚本就实现了一步认证,再也不用手动打开网页输入账号密码了;而且这个shell脚本只要稍稍改下就可以在路由器上使用,上周末的时候我就动手把X讯的K2路由器刷了OpenWRT,然后安装了curl,最后把脚本scp到路由器里,然后通过corntab建了一个定时任务执行脚本,完美的实现了通过路由器来认证校园网。
corn表达式:
结构:从左到右(空格隔开):秒 分 时 日 月 星期 年份(年份可选)
字段含义:
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒(Seconds) | 0~59 | , - * / |
分(Minutes) | 0~59 | , - * / |
小时(Hours) | 0~23 | , - * / |
日期(DayofMonth) | 1~31 | ,- * ? / L W C |
月份(Month) | 1~12或英文月份简写 | , - * / |
星期(DayofWeek) | 1~7或英文星期简写(1代表周日) | , - * ? / L C # |
年(可选,留空)(Year) | 1970~2099 | , - * / |
常用表达式样例:
表达式 | 含义 |
---|---|
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 * * ? | 每天上午10:15触发 |
0 15 10 * ? | 每天上午10:15触发 |
0 15 10 * * ? 2005 | 2005年的每天上午10:15触发 |
0 * 14 ? | 在每天下午2点到下午2:59期间的每1分钟触发 |
0 0/5 14 * * ? | 在每天下午2点到下午2:55期间的每5分钟触发 |
0 0/5 14,18 * * ? | 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 |
0 0-5 14 * * ? | 在每天下午2点到下午2:05期间的每1分钟触发 |
0 10,44 14 ? 3 WED | 每年三月的星期三的下午2:10和2:44触发 |
0 15 10 ? * MON-FRI | 周一至周五的上午10:15触发 |
0 15 10 15 * ? | 每月15日上午10:15触发 |
0 15 10 L * ? | 每月最后一日的上午10:15触发 |
0 15 10 ? * 6L | 每月的最后一个星期五上午10:15触发 |
0 15 10 ? * 6L 2002-2005 | 2002年至2005年的每月的最后一个星期五上午10:15触发 |
0 15 10 ? * 6#3 | 每月的第三个星期五上午10:15触发 |