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
分析方法
- 排除人为变更脚本,环境的因素
- 分析日志,主要包括三块日志的内容:
- 系统日志:
/var/log/messages
- cron日志:
/var/log/cron
- 任务日志:如果定时任务的脚本设了日志的话
- 系统日志:
怎么配一个正确的crontab任务
按我自己的经验来说,有这么几点需要注意
- 使用绝对路径配置命令和脚本
- 每个定时任务,一定带上执行日志,即
> /tmp/xxx.log 2>&1 &
这样的后缀,否则有可能把磁盘的inode撑爆,而且不好定位错误 - 脚本内所需的环境变量,在脚本内主动设置好
网友评论