crontab 執行環境變量的問題

記錄一下一個折磨我N天的crontab的問題 php

問題是這樣的 html

我寫了個php腳本run.php ,腳本里面調用了一下hive命令(hadoop相關的東西)生成hive_result.txt,同時在hive命令執行前和執行後都會用php命令生成文件log1和log2 shell

而後我要讓這個php腳本每一分鐘執行一次 bash

因而用‘crontab -e’在配置文件裏面增長了一條。 oop

奇怪的事情經過crontab執行的狀況是log1和log2都生成了可是hive_result.txt卻沒生成。可是在shell裏面直接執行run.php那麼log1  log2  hive_result.txt均可以生成。我懷疑是否是shell的環境變量和crontab的環境變量不同,因此可能hive命令找不到。 spa

因而作了個實驗在crontab的配置文件裏面加了一條 code

*/1 * * * *   printenv >  /home/sby_1104/env.text



這個是告訴crontab每隔一分鐘把它的環境變量輸出到env.txt文件裏,果不其然,env.txt文件裏面的內容很是少只有以下的一點東西 server

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的命令的路徑。 htm

這時我有想到重定向不只能夠重定向std輸出,也能夠重定向錯誤信息。因而我又在crontab中增長一條 blog

*/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

相關文章
相關標籤/搜索