Linux的crontab命令是DBA经常会用到的一个功能,用来实现定时任务。具体的用法介绍,网上一搜一大堆,我就不写了。我这里主要汇总一下,当crontab不生效的时候,可能的原因以及分析方法。

原因一:脚本没有执行权限

说明

一般来说,crontab里面是建议用sh或者bash来执行shell脚本;如果是其他类型脚本,也建议带上二进制命令的全路径,避免脚本本身没有x权限,或者命令找不到这类情况。

分析方法

拷贝crontab -l里面的命令手动执行,验证一把权限。

原因二:缺失环境变量

说明

有时候,手动执行一点问题没有,放到crontab里面,就是不生效,很苦恼。这个时候,第一个需要怀疑的就是环境变量有问题。因为crontab内部引用的环境变量和命令行是有区别的

分析方法

确认脚本里面是不是引用了一些特殊的环境变量,比如指定的lib目录,python的一些第三方包,特定用户下的命令等等。可以尝试简化脚本内容,通过打印日志的方法来确认。
解决办法呢,一般也是两个思路:

  • 在脚本的开头就主动export一下环境变量(推荐
  • 修改crontab默认的环境变量

原因三:用户密码过期

说明

这个属于比较少见的一类情况,本来正常运行的定时任务,突然某天就失效了,有可能就是这个原因。在cron日志里面会有这个错误消息:Authentication token is no longer valid; new one required

分析方法

  1. 排除人为变更脚本,环境的因素
  2. 分析日志,主要包括三块日志的内容:
    • 系统日志:/var/log/messages
    • cron日志:/var/log/cron
    • 任务日志:如果定时任务的脚本设了日志的话

怎么配一个正确的crontab任务

按我自己的经验来说,有这么几点需要注意

  • 使用绝对路径配置命令和脚本
  • 每个定时任务,一定带上执行日志,即> /tmp/xxx.log 2>&1 &这样的后缀,否则有可能把磁盘的inode撑爆,而且不好定位错误
  • 脚本内所需的环境变量,在脚本内主动设置好