[積累] 對一次 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 指令碼對於環境的依賴性,便於移植.
程式設計師開發節奏快,任務急,很多問題大家都是用到哪學到哪,不求甚解.
到後來會發現,越來越多的問題都是基礎不紮實導致的.還是基礎最重要啊.