2010-05-19 66 views
2

我有一個執行幾個文件操作的bash腳本。當任何用戶運行這個腳本時,它會成功執行並輸出幾行文本,但是當我嘗試cron時,會出現問題。它似乎運行(我看到在cron日誌中顯示它已被啓動的條目),但沒有任何反應,它不輸出任何內容,也不執行任何文件操作。它也不會出現在正在運行的進程中,因此它似乎立即退出。

經過一些故障排除後,我發現刪除「set -e」解決了這個問題,現在它從系統cron運行沒有問題。所以它可以工作,但我寧願設置-e啓用,以便腳本在出現錯誤時退出。有誰知道爲什麼「set -e」導致我的腳本退出?

感謝您的幫助,
瑞安爲什麼在crontab中調用set -e會導致腳本失敗?

+0

如果'set -e'導致它在出錯時退出......那不就是說某處出現了錯誤嗎? – 2010-05-19 23:30:19

+0

如果我手動運行它,腳本就會執行。 Als,如果遇到任何問題,錯誤代碼應在退出之前打印到stdout。這沒有發生。 – SDGuero 2010-05-19 23:39:23

+0

除非您顯示腳本,否則我們無法確定問題可能出在哪裏。另外,在我看來,'set -e'不能代替正確的錯誤處理,因此根本不應該使用。 – 2010-05-20 00:32:09

回答

4

當你的腳本在cron下運行,環境變量和路徑可以在腳本由用戶直接運行超過設定不同。也許這就是爲什麼它的行爲不同?

測試此操作:創建一個除printenvecho $PATH之外什麼也不做的新腳本。 手動運行此腳本,保存輸出,然後將其作爲cron作業運行,保存該輸出。 比較兩種環境。我相信你會發現不同之處......一個交互式的 登錄shell將通過採購「.login」,「.bash_profile」, 或類似的腳本(取決於用戶的shell)來建立其環境。這通常不會在 cron作業中發生,這通常是cron作業與在登錄shell中運行 相同腳本的行爲不同的原因。

要解決這個問題:在腳本的頂部,明確地設置環境變量 和路徑交互式環境相匹配,或者源用戶「的.bash_profile」, 「的.login」,或其他安裝腳本,取決於他們正在使用的外殼。

+0

我同意吉姆。除了cron以用戶身份運行外,我可以在不出問題的情況下手動啓動腳本。讓我們把它USER1 ... 如果我打開一個SSH會話,登錄爲用戶1然後運行/scripts/myscript.sh它的偉大工程,但如果我添加腳本作爲日常過程中的user1的cron它永遠不會完成運行和無產生錯誤。如果我刪除「設置-e」從我的腳本的頂部,它然後運行從cron罰款,有stdout或stderr沒有錯誤雖然標準的腳本輸出顯示出來。我完全難倒這... – SDGuero 2010-05-19 23:42:16

+0

@SDGuero:我已經擴大了我的東西可能是怎麼回事,有一些額外的故障排除建議的說明。希望這可以幫助。 – 2010-05-20 17:38:12

4

隨着set -e,腳本將停止在第一個命令,它給出一個非零退出狀態。這並不一定意味着你會看到一條錯誤消息。

下面是一個示例,使用false命令,該命令除了退出並顯示錯誤狀態之外什麼也不做。

沒有set -e

$ cat test.sh 
#!/bin/sh 

false 
echo Hello 

$ ./test.sh 
Hello 
$ 

但隨着set -e出口相同的腳本不打印任何東西:

$ cat test2.sh 
#!/bin/sh 

set -e 

false 
echo Hello 

$ ./test2.sh 
$ 

根據你的觀察,這聽起來像你的腳本失敗出於某種原因(可能是相關的正如吉姆劉易斯所建議的那樣)在它產生任何輸出之前。

要進行調試,請將set -x添加到腳本的頂部(以及set -e),以便在執行命令時顯示它們。

相關問題