记录一下一个折磨我N天的crontab的问题
问题是这样的
我写了个php脚本run.php ,脚本里面调用了一下hive命令(hadoop相关的东西)生成hive_result.txt,同时在hive命令执行前和执行后都会用php命令生成文件log1和log2
然后我要让这个php脚本每一分钟执行一次
于是用‘crontab -e’在配置文件里面增加了一条。
奇怪的事情通过crontab执行的情况是log1和log2都生成了但是hive_result.txt却没生成。但是在shell里面直接执行run.php那么log1 log2 hive_result.txt都可以生成。我怀疑是不是shell的环境变量和crontab的环境变量不一样,所以可能hive命令找不到。
于是做了个实验在crontab的配置文件里面加了一条
*/1 * * * * printenv > /home/sby_1104/env.text
这个是告诉crontab每隔一分钟把它的环境变量输出到env.txt文件里,果不其然,env.txt文件里面的内容非常少只有如下的一点东西
SHELL=/bin/sh USER=sby_1104 PATH=/usr/bin:/bin PWD=/home/sby_1104 SHLVL=1 HOME=/home/sby_1104 LOGNAME=sby_1104 _=/usr/bin/printenv
因此可以基本确定是环境变量不一样的导致的。crontab的环境变量的path中确实不包含hive的命令的路径。
这时我有想到重定向不仅可以重定向std输出,也可以重定向错误信息。于是我又在crontab中增加一条
*/1 * * * * hadoop fs -ls /home/abc/ > /home/sby_1104/test.txt 2>&1
这个是将错误和标准输出都输出到test.txt文件
然后查看text.txt发现如下内容
/bin/sh: hadoop: command not found
问题的症结找到了,解决问题当然就很容易,调用命令的时候都用绝对路径就好了。
参考:
http://serverfault.com/questions/337631/crontab-execution-doesnt-have-the-same-environment-variables-as-executing-user
http://stackoverflow.com/questions/15557777/crontab-job-does-not-get-the-environment-variables-set-in-bashrc-file
http://blog.sina.com.cn/s/blog_439f80c40101g2hr.html