我有一個執行幾個文件操作的bash腳本。當任何用戶運行這個腳本時,它會成功執行並輸出幾行文本,但是當我嘗試cron時,會出現問題。它似乎運行(我看到在cron日誌中顯示它已被啓動的條目),但沒有任何反應,它不輸出任何內容,也不執行任何文件操作。它也不會出現在正在運行的進程中,因此它似乎立即退出。
經過一些故障排除後,我發現刪除「set -e」解決了這個問題,現在它從系統cron運行沒有問題。所以它可以工作,但我寧願設置-e啓用,以便腳本在出現錯誤時退出。有誰知道爲什麼「set -e」導致我的腳本退出?
感謝您的幫助,
瑞安爲什麼在crontab中調用set -e會導致腳本失敗?
回答
當你的腳本在cron下運行,環境變量和路徑可以在腳本由用戶直接運行超過設定不同。也許這就是爲什麼它的行爲不同?
測試此操作:創建一個除printenv
和echo $PATH
之外什麼也不做的新腳本。 手動運行此腳本,保存輸出,然後將其作爲cron作業運行,保存該輸出。 比較兩種環境。我相信你會發現不同之處......一個交互式的 登錄shell將通過採購「.login」,「.bash_profile」, 或類似的腳本(取決於用戶的shell)來建立其環境。這通常不會在 cron作業中發生,這通常是cron作業與在登錄shell中運行 相同腳本的行爲不同的原因。
要解決這個問題:在腳本的頂部,明確地設置環境變量 和路徑交互式環境相匹配,或者源用戶「的.bash_profile」, 「的.login」,或其他安裝腳本,取決於他們正在使用的外殼。
我同意吉姆。除了cron以用戶身份運行外,我可以在不出問題的情況下手動啓動腳本。讓我們把它USER1 ... 如果我打開一個SSH會話,登錄爲用戶1然後運行/scripts/myscript.sh它的偉大工程,但如果我添加腳本作爲日常過程中的user1的cron它永遠不會完成運行和無產生錯誤。如果我刪除「設置-e」從我的腳本的頂部,它然後運行從cron罰款,有stdout或stderr沒有錯誤雖然標準的腳本輸出顯示出來。我完全難倒這... – SDGuero 2010-05-19 23:42:16
@SDGuero:我已經擴大了我的東西可能是怎麼回事,有一些額外的故障排除建議的說明。希望這可以幫助。 – 2010-05-20 17:38:12
隨着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
),以便在執行命令時顯示它們。
- 1. 爲什麼第二個參數會導致此腳本失敗?
- 2. 爲什麼包含空文件會導致PHP腳本失敗?
- 3. 爲什麼調用Session.Clear()會導致此測試失敗?
- 4. Shebang導致腳本失敗
- 5. 爲什麼不設置-e導致「false」失敗?假&&真'?
- 6. Perl腳本失敗crontab
- 7. 什麼會導致遊標失敗?
- 8. 什麼會導致TreeView_InsertItem失敗?
- 9. 爲什麼使用ledpar會導致文檔失敗?
- 10. 爲什麼使用Frameset DTD會導致驗證失敗?
- 11. fillRect()導致我的腳本失敗
- 12. 爲什麼從我的Perl CGI腳本中調用mutt失敗?
- 13. 什麼會導致表單按鈕在Firefox中失敗?
- 14. 爲什麼以下JQuery Ajax調用會導致IE9中的腳本錯誤?
- 15. 爲什麼打開@Cacheable會導致我的事務失敗?
- 16. 爲什麼C#ProcessStartInfoRedirectStandardOutput會導致xcopy進程失敗
- 17. 爲什麼包含TranslatedText節點會導致XslCompiledTransform失敗?
- 18. 爲什麼更改%USERPROFILE%會導致sHGetFolderPath SIDL_APPDATA失敗?
- 19. 爲什麼recaptcha不會導致此測試失敗?
- 20. 什麼會導致HashMap containsKey()失敗並以String爲關鍵字?
- 21. 爲什麼這會導致渲染測試失敗?
- 22. 爲什麼設置ManyToOne父項會導致刷新失敗?
- 23. 爲什麼log()語句會導致lmList失敗?
- 24. Bash腳本工作但crontab失敗
- 25. 這個SQL腳本爲什麼失敗?
- 26. 爲什麼從PHP腳本調用(ImageMagick)convert.exe會導致頁面無響應?
- 27. 什麼會導致IE9在重定向時失敗?
- 28. 什麼會導致ifstream代碼在OS X上失敗?
- 29. 爲什麼session_start在一個腳本使用curl調用另一個腳本時會導致超時
- 30. 爲什麼在ComponentDidMount中調用setState會導致錯誤?
如果'set -e'導致它在出錯時退出......那不就是說某處出現了錯誤嗎? – 2010-05-19 23:30:19
如果我手動運行它,腳本就會執行。 Als,如果遇到任何問題,錯誤代碼應在退出之前打印到stdout。這沒有發生。 – SDGuero 2010-05-19 23:39:23
除非您顯示腳本,否則我們無法確定問題可能出在哪裏。另外,在我看來,'set -e'不能代替正確的錯誤處理,因此根本不應該使用。 – 2010-05-20 00:32:09