crontab 执行环境变量的问题

记录一下一个折磨我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


真想终于大白了,就是由于crontab执行环境的环境变量和shell执行环境变量不一样造成的。

问题的症结找到了,解决问题当然就很容易,调用命令的时候都用绝对路径就好了。







参考:

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

你可能感兴趣的:(crontab 执行环境变量的问题)