0 */2 * * *
当初就觉得怪怪的,总也记不住,今天才知道原来这是cron syntax。
同时Jenkins中的定时任务使用的scheduler也是使用cron语法定义的。还有在spring中引用的定时任务。
- Cron in UNIX
Cron is a time-based job scheduler in Unix-like computer operating systems。cron allows tasks to be automatically run in the background at regular intervals by the cron daemon.
Crontab (CRON TABle) is a file which contains the schedule of cron entries to be run and at specified times. 所以编辑这个文件就能定义定时任务。
所以我想很多其它java相关的框架,工具都使用cron就非常合理了。因为java很多应用都是在linux,unix运行的。
因此明白cron非常有必要。
Crontab中有6列:
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0 - 6) (Sunday=0)
| | | +------- month (1 - 12)
| | +--------- day of month (1 - 31)
| +----------- hour (0 - 23)
+------------- min (0 - 59)
前5列定义的是schedular。最后一列定义运行的命令。下面结合例子讲解:
1,*符号:
30 18 * * * rm /home/someuser/tmp/*
表示每天18点30分运行rm命令。其中*表示任意值,此例中就是说,不考虑day of month, month 和 day of week的值。
如果*在前:
* 5 * * * rm /home/someuser/tmp/*
表示从凌晨5点到凌晨6点之间,每分钟运行一次。
2,用逗号分割的值:
0 0 1,10,15 * * rm /home/someuser/tmp/*
表示在一个月的第1天,第10天,第15天的0点0分运行命令。
3,range:
0 0 * * 1-5 ls -l
1-5表示从星期一到星期五每天0点0分运行命令ls。
4, 如果同时指定了day of month和day of week,就是都运行的关系。
0 0 10 * 1 ls -l
在每个月的第10天和每个星期一运行命令。
5,Repeat pattern:
*/10 * * * * ls -l
表示每隔10分钟运行一次命令。如果是0-10/5则表示,在每个小时头10分钟内,每5分钟运行一次。
* 10/2 * * * ls -l
则表示从每天的第10小时开始,每隔2小时的一个小时间隔内,每秒运行一次。
6,除里上面5个定义时间的field之外,cron中还可以使用关键字:
@yearly @hourly @daily @reboot
除@reboot表示启动后运行外,其他都可以用上面讲的cron语法表示一样的时间。
例如@hourly就等于0 * * * * command
使用时就是:
@hourly command 其实就是简便写法。
cron语法就是这些。另外cron不支持精确到秒级的定时任务,只能到分钟。
- Cron in Spring
在spring框架中,我们经常使用的org.springframework.scheduling.quartz.CronTriggerBean
并不完全等同于cron的语法。
quartz比cron多出两位:second和year。所以quartz是可以到秒级的,下面是官网的说明:
http://quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/crontrigger