1. 程式人生 > >[積累] 對一次 crontab 執行失敗的除錯

[積累] 對一次 crontab 執行失敗的除錯

問題:

任務目標是每隔一段時間將某 mongo 資料庫內的某段資訊,匯入到 mysql 資料庫,系統為 CentOS 6.5.

主體指令碼採用 php 編寫,但為了呼叫方便,並和其他指令碼接合使用,又做了一個 bash 指令碼封裝了該 php 指令碼.

然後由 crontab 執行該 bash 指令碼,完成排期任務.

編寫完成後,卻發現 php 的日誌檔案始終沒有記錄到執行資訊.

解決:

檢視 /var/log/cron ,確認 crontab 配置已生效,bash 指令碼已被呼叫.

單獨執行 bash 指令碼,可正常工作.

單獨執行 php 指令碼,可正常工作,並且日誌列印羅輯也沒有錯誤.

在 bash 指令碼中加入日誌列印,發現在被 crontab 執行時, bash 羅輯正常,唯獨 php 指令碼沒有任何執行痕跡.

最後決定認真看下 crontab 機制,發現:

crontab 有自己的 PATH 機制,和使用者環境的 PATH 不是一回事.

crontab 的 PATH 要在 /etc/crontab 這個檔案中去編輯,預設沒有 /usr/local/bin 這個路徑.

而所用伺服器的 php 是編譯安裝的,安裝完成後手動將 php 直譯器 ln -s 到 /usr/local/bin 下了,卻沒有放在 /usr/bin 目錄下.

所以手動執行 bash 指令碼和 php 指令碼都可以成功,但被 crontab 執行就不成功,因為直譯器沒有找到...

知道原因,解決辦法就簡單了.

或者將直譯器路徑軟鏈到 crontab 可識別的路徑內;

或者編輯 /etc/crontab 將 /usr/local/bin 加入 PATH 內;

或者在 bash 指令碼內執行 php 指令碼時,用 php 直譯器的全路徑去執行.

我採用了第三個,因為這樣減少了該 bash 指令碼對於環境的依賴性,便於移植.

程式設計師開發節奏快,任務急,很多問題大家都是用到哪學到哪,不求甚解.

到後來會發現,越來越多的問題都是基礎不紮實導致的.還是基礎最重要啊.