美文网首页
定时任务

定时任务

作者: zhou | 来源:发表于2016-11-08 10:30 被阅读192次

    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。

    相关文章

      网友评论

          本文标题:定时任务

          本文链接:https://www.haomeiwen.com/subject/cxsauttx.html