定时任务
Linux任务计划功能可以通过crontab命令来完成。
常用选项:
-u:表示指定某个用户,不加该选项则指定为当前用户。
-e:表示编辑计划任务。
-l:表示列出计划任务。
-r:表示删除计划任务。
每条计划任务格式为:
分钟 小时 日 月 周 命令
分钟范围为:00-59
小时范围为:00-23
日期范围为:1-31
月范围为: 1-12
周范围为: 0-7 (0和7都表示周日)
计划任务的日志文件:/var/log/cron.log
常见错误:
- 1、计划任务的命令中使用%的时候,未加反斜线\
比如设置一个计划任务,每分钟都将当前日期追加到日志文件中,日期格式为:年-月-日 时:分:秒
*/1 * * * * date +'%Y-%m-%d %H:%M:%S' >> /tmp/log.txt
实际上,上面计划任务并没有如期执行。
我们可以查看计划任务日志文件(/var/log/cron.log),发现其中有,
Sep 10 14:46:01 coding /USR/SBIN/CRON[3900]: (coding) CMD (date +')
这么一行记录。可以看出计划任务并没有正确解析%。
那么,正确地做法就是在%前面加上反斜线\。
*/1 * * * * date +'\%Y-\%m-\%d \%H:\%M:\%S' >> /tmp/log.txt
- 2、第三个域与第五个域执行的是'或'操作,也就是日和周。
比如一个计划任务:
0 23 1-10 * 1 echo 'ok'
正常理解,上面的计划任务应该是在每个月的1号到10号,并且是星期一的时候,
晚上11点执行。
但实际上,计划任务并不是这样执行的,因为第三个域与第五个域执行的是'或'操作。
那上面的计划任务是怎么执行的呢?它是在每个月的1号到10号,和星期一的时候,晚上11点执行。
那如果想要的是在每个月的1号到10号,并且是星期一的时候,晚上11点执行,那该怎么做呢?
可以在计划任务的命令中判断是否是星期一。
0 23 1-10 * * test `date +\%w` -eq 1 && echo 'ok'
date +%w获得今天是星期几,test是一个判断命令,test `date +%w` -eq 1判断当天是否是星期一,
如果是,则继续执行&&后面的命令,否则不执行。
- 3、分钟设置错误
有一个计划任务,每隔两个小时执行一次,很多人一开始这样写:
* */2 * * * echo 'ok'
现在来分析一下,比如现在是0点1分钟,满足上面条件。过了一会,是0点2分钟,满足上面条件吗,也满足,
因为上面分钟使用的是*,表示匹配任何分钟。所以正确地写法应该是:
0 */2 * * * echo 'ok'
将分钟设置为0。