Cron
crontab
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语chronos(χρόνος),原意是时间。
通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
crontab文件
crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc之下的子目录中,而这个文件只能由系统管理员来修改。
crontab文件的每一行均遵守特定的格式,由空格或tab分隔为数个领域,每个领域可以放置单一或多个数值。
操作符号
在一个区域里填写多个数值的方法:
- 逗号(',')分开的值,例如:“1,3,4,7,8”
- 连词符('-')制定值的范围,例如:“1-6”,意思等同于“1,2,3,4,5,6”
- 星号('*')代表任何可能的值。例如,在“小时域”里的星号等于是“每一个小时”,等等
某些cron程序的扩展版本也支持斜线('/')操作符,用于表示跳过某些给定的数。例如,“*/3”在小时域中等于“0,3,6,9,12,15,18,21”等被3整除的数;
时间设置
# 文件格式说明
# ——分钟(0 - 59)
# | ——小时(0 - 23)
# | | ——日(1 - 31)
# | | | ——月(1 - 12)
# | | | | ——星期(0 - 7,星期日=0或7)
# | | | | |
# * * * * * 被执行的命令
注:
- 在“星期域”(第五个域),0和7都被视为星期日。
- 不很直观的用法:如果日期和星期同时被设定,那么其中的一个条件被满足时,指令便会被执行。请参考下例。
- 前5个域称之分时日月周,可方便个人记忆。
从第六个域起,指明要执行的命令。
crontab命令的使用
由于MAC OS自带cron,就无需在安装crond服务了。
样例:
-
创建一个新的crontab文件,并在文件内写入cron表达式,例如
* * * * * date >> ~/tmp/ls.txt
(含义为每隔一分钟将当前日期写入到ls.txt中)cd ~/tmp touch temp_cron && vim temp_cron
-
提交刚刚创建的crontab文件
crontab temp_cron
-
列出crontab文件,可以看到
* * * * * date >> ~/tmp/ls.txt
crontab -l
-
查看ls.txt文件,可以看到定时任务生效
Thu Jul 20 14:59:00 CST 2017
Thu Jul 20 15:00:00 CST 2017
Thu Jul 20 15:01:00 CST 2017
Thu Jul 20 15:02:00 CST 2017
Thu Jul 20 15:03:00 CST 2017
Thu Jul 20 15:04:00 CST 2017
Thu Jul 20 15:05:00 CST 2017 -
编辑crontab文件
crontab -e
-
删除crontab文件,cron任务停止
crontab -r
Quartz中的cron表达式
格式
格式为{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
,较crontab的表达式,多了秒和年。
格式详解
字段
字段 | 有效范围 | 特殊字符 |
---|---|---|
秒 | 0~59 | , - * / |
分钟 | 0~59 | , - * / |
小时 | 0~23 | , - * / |
日期 | 0~31 | , - * / ? L W C |
月 | 0~11 | , - * / |
星期 | 1~7 或 SUN,MON,TUE,WED,THU,FRI,SAT | , - * / ? L # C |
年份 | 1970~2099 | , - * / |
通配符
通配符 | 含义 |
---|---|
, | 用来列出枚举值,例如:在分钟字段里用“5,20”意味着在5和20分每分钟会触发一次 |
- | 指定一个值的范围 |
* | 代表所有可能的值 |
/ | 用来指定数值的增量例如:在分钟字段里用“0/15”表示从第0分钟开始,每15分钟 |
? | 表示不指定值 |
L(Last) | 用在日期表示一个月中的最后一天例如:6L,表示某月的倒数第6天用在星期表示一个月中的最后一个星期x例如:FRIL,表示某月的最后一个星期五 |
W(Work) | 指定离给定日期最近的工作日(周一到周五)例如:在日期字段用“15W”指这个月最接近第15天的工作日,如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发如果这个月第15天是周日,那么触发器将会在这个月第16天即周一触发 |
C(Calendar) | 指和日历关联后计算过的值例如:在日期 字段用“5C”指在这个月第5天;在星期字段用“1C”指在周日 |
#(No) | 表示该月第几个星期x例如:4#2,表示某月的第二个星期三;6#3,表示某月的第三个星期五 |
注意:
- 其中每个元素可以是一个值,一个连续区间,一个间隔时间,一个列表,通配符。
- 由于"日期"和"星期"这两个元素互斥的,必须要对其中一个设置"?"。
常用例子
- "0 0 12 * * ?" 每天12点触发
- "0 0 12,20 * * ?" 每天12点和20点触发
- "0 0/5 * * * ?" 每隔5分钟触发一次
- "0 0 10 * * ? 2015" 2015年的每天10点触发
- "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
- "0 15 10 15 * ?" 每月15日上午10:15触发
- "0 15 10 L * ?" 每月最后一日的上午10:15触发