corn表达式

Author Avatar
Damon Lee 7月 30, 2018
  • 在其它设备中阅读本文章
熟悉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触发
其实上述的表达式只要做到随用随查就好,所以最好大家都收藏或者记录下。