搜索

关于crontab我们就是认真!crontab从入门到出坑

gecimao 发表于 2019-06-18 20:00 | 查看: | 回复:

  我的理解,后台任务通常分为两种:常驻和定时。之前的文章《pm2进程管理工具使用总结》主要针对的是常驻任务。今天来谈谈crontab,主要针对的是定时任务。

  crontab的服务进程名为crond,英文意为周期任务。顾名思义,crontab在Linux主要用于周期定时任务管理。通常安装操作系统后,默认已启动crond服务。crontab可理解为cron_table,表示cron的任务列表。类似crontab的工具还有at和anacrontab,但具体使用场景不同,可参见附录《让你学会Linux计划任务》一文了解更多。

  当然,更多使用场景是要以视具体情况而定了。毕竟是工具通常都是常用规则总结而成的产物。

  从上面结果看出,每分钟执行了date并写入到/tmp/time.txt。

  上面的实验中使用了crontab命令的-e选项。我们来看看crontab命令中有哪些选项?

  -e 选项表示打开当前用户的crontab任务列表配置文件。当然也可以直接打开,路径通常是在/var/spool/cron/下,文件以用户名命名,如/var/spool/cron/root。不过,采用-e方式打开,福利是可以帮助我们自动检查任务配置符合规则。

  -u 选项指定某用户的任务列表,很好理解。比如我当前是root用户,想操作poloxue用户的任务列表。如下:

  -r 选项删除某用户的所有任务列表,这个选项使用小心为上,估计也只是自己实验时玩玩而已,正常不使用。

  说完了crontab的命令选项,下面开始真正的大戏,任务列表文件如何配置?

  从上面的示例文件可看出,crontab的任务列表主要由两部分组成:环境变量配置与定时任务配置。可能大家在工作中更多是只用到了任务配置部分。

  理解环境变量配置这部分可以帮助我们减少去踩一些不必要的坑。简单说明上面涉及的环境变量。

  PATH表示到哪些目录路径寻找命令程序,此环境变量的值说明了为什么我们在crontab中执行命令时,尽量要写命令全路径才能执行的原因。

  MAILTO变量作用是当任务执行有输出时,内容发送到哪个用户的邮箱。禁用可以设置MAILTO=”“。

  当我们在使用crontab时,发现某些定时任务不能顺利执行,但shell控制台执行成功,环境变量是否正确是我们需要首先关注的点之一。具体详情可以看后面关于环境变量坑的说明。

  第五列单位为星期,表示每星期第几天,范围0-7,0与7表示星期日,其他分别为星期1-6;

  整除值,根据指定数值是能否被整除确定执行时间,如指定零时开始每3个小时0分执行一次任务

  混合值,支持以上类型的组合,如指定每小时0至10分,22、33分以及所有能被20整除的分时执行任务,如下

  这里的分钟值采取了多种类型组合指定,包括连续范围值(0-7),列表值(22,33),整除值(*/20)。

  声明:这几种时间配置类型是编者自己总结,希望能帮助大家更好理解。有错误帮忙指出。

  通常在使用crontab添加任务时,我们会依靠自己已有知识编写定时语句。当需要测试语句是否正确时,总需要一定时间等待证明其正确性。作为一名牛逼的程序员,这种方式就太不酷了。有没有一款工具,只要我们给出语句,其就能告诉具体执行时间呢?下面介绍一款老外开发的crontab在线解析工具。

  从上面看出,我们输入的语句解析结果为每天的04:05执行任务。下面有这样一行文字“next at 2016-12-31 04:05:00”,告诉了我们最近一次的执行时间。

  注明:百度搜索“crontab在线解析”获得的工具有坑,某些语句解析结果错误。为避免大家受骗,这里提供具体地址:

  crontab使用中常会遇到各种坑。下面列出编者在使用中曾遇到的一些问题。

  此处介绍两种坑,一种是由于基本功不足导致配置错误,而另一种则是多数人对crontab配置都存在的一个理解误区。

  其实这个错误不用单独说明,但是编者刚开始接触crontab时犯过,单独拿出来说明一下。

  下面列出错误方式,当我们听到每天3点执行一次某任务时,很多人会把重点放在3点,而忽略了执行一次的需求。

  分解任务要求,首先,第一个星期就是每个月的1-7日,而星期一就是星期一。所以我们理解的crontab任务配置如下

  解析结果显示语句执行时间为每月的1至7日和每星期一。可以看到最近执行时间是“next at 2017-01-01 00:00:00”,这个时间也并非星期一。

  请注意,前面提到的那个百度搜索出来的工具分析结果显示的确是每月第一个星期一,这是错误的。如有朋友持怀疑态度,可自行验证,如有错误,随时告知。

  当我们刚使用crontab时,有人会告知所有命令尽量都使用绝对路径,以防错误。为什么?这就和我们下面要谈的环境变量有关了。

  对比crontab与控制台输出,我们发现两者的环境变量差异很大。如果命令在控制台执行成功,而在crontab执行失败,我们需要考虑是否命令涉及的环境变量在crontab和控制台间存在差异。

  当然,对于某特定环境变量或有特定的处理方式,如PATH,命令使用绝对路径亦可解决。

  关于这个问题的具体说明,可以参看附录中的《Crontab and %》。

  如任务有大量输出,会占用磁盘资源。但编者测试显示,如磁盘容量不足,任务也会执行,但输出不会写入邮件;

  是不是关闭邮件写入就好了?附录《Linux中的crontab与sendmail》博文表明,关闭mail功能,输出内容将写入到/var/spool/clientmqueue中,可能占满分区的inode资源,导致任务无法执行。inode资源使用情况可通过如下命令获取

  抱歉!这种情况编者并未测出!但在公司的生产环境发现过未重定向则任务不执行的情况,加上后解决了问题。百度也搜索到了类似问题,如有朋友了解,欢迎指教,万分感谢。

  如大家对重定向有疑惑,可参见附录中的《Linux重定向》,对文解释不错。

  最后的福利,编者根据自己的总结而梳理出一套快速定位crontab错误的思路。两个角度:

  日志中包含任务执行记录,配置错误提示,任务配置编辑重载记录,服务开启等记录。

  通过上面的日志分析,如任务没有执行,使用定时语句在线分析工具分析定时是否正确,非常简单。

  crontab中的命令执行出错,多数人都不知道如何调试。我们知道在控制台执行命令时,可通过输出获取错误信息调试问题。这种方式在crontab同样适用,方法就是利用重新向获取输出,进行分析。示例如下

  显示php命令没有找到,很明显的就可以确定是环境变量的问题。这种方式定位问题非常有效。

  有了命令执行的输出,下面就是具体问题具体分析了。或许是前面提到的各种坑,也或许是命令本身所独有的问题。

  调试的方法到这里就说完了。但还是实践为王,需持续总结,同时也希望大家不要在同样的坑中重复犯错。

本文链接:http://kingstonflowers.net/dingshirenwu/659.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部