Linux 的 Crontab
Linux 下的 Crontab 表达式有五个域,分表表示:分钟、小时、日期、月、星期。
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
特殊字符
在每个域中除了指定特定值外,还可以使用如下特殊字符:
-
星号(*):代表所有可能的值,例如月域如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
-
逗号(,):代表枚举值,可用来隔开指定一个列表范围,例如,“1,2,5,7,8,9”
-
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
-
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10,如果用在 minute 字段,表示每十分钟执行一次。
java中的 cron
java中对cron表达式进行了扩展,在spring和quartz中对其进行了支持。Spring 的 cron 表达式有六个域,quartz中支持七个域(最后一位年是可选的)。
分别表示:秒、分钟、小时、日期、月份、星期、[年]
Java(Spring)
* * * * * *
- - - - - -
| | | | | |
| | | | | +----- day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | +---------- month (1 - 12) OR jan,feb,mar,apr ...
| | | +--------------- day of month (1 - 31)
| | +-------------------- hour (0 - 23)
| +------------------------- min (0 - 59)
+------------------------------ second (0 - 59)
Java(Quartz)
* * * * * * *
- - - - - - -
| | | | | | |
| | | | | | + year [optional]
| | | | | +----- day of week (1 - 7) sun,mon,tue,wed,thu,fri,sat
| | | | +---------- month (1 - 12) OR jan,feb,mar,apr ...
| | | +--------------- day of month (1 - 31)
| | +-------------------- hour (0 - 23)
| +------------------------- min (0 - 59)
+------------------------------ second (0 - 59)
特殊字符
同样的,每个域也可以使用特殊字符,特殊字符:【*】,【,】,【-】,【/】与 Crontab 含义一样,除此之外还支持另外一些特殊字符:
-
(?):也表示任意值,只能用在“日期”和“星期”域,当这两个域其中之一使用了【*】后,为了避免冲突,需要将另一个域的值设为【?】。
-
(L):表示最后,Last 的意思,只能出现在“星期”和“日期”域,如果在“星期”域使用 5L,则表示在最后的一个星期四触发。
-
(W):表示有效工作日(周一到周五),只能出现在日期域,系统将在离指定日期的最近的有效工作日触发事件。
-
(LW):这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。例如:在日期域使用 5W,如果 5 日是星期六,则将在最近的工作日:星期五,即 4 号触发;如果 5 日是星期天,则在 6 日触发;如果 5 日在星期一到星期五中的一天,则就在 5 日触发。另外一点,W 的最近寻找不会跨过月。
-
(#):用于确定每个月第几个星期几,只能出现在“星期”域。例如在 6#3,表示某月的第三个星期五。
示例
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 触发