記錄一下一個折磨我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
問題的癥結找到了,解決問題固然就很容易,調用命令的時候都用絕對路徑就行了。
參考: