問題:
任務(wù)目標是每隔一段時間將某 mongo 數(shù)據(jù)庫內(nèi)的某段信息,導(dǎo)入到 mysql 數(shù)據(jù)庫,系統(tǒng)為 CentOS 6.5.
主體腳本采用 php 編寫,但為了調(diào)用方便,并和其他腳本接合使用,又做了一個 bash 腳本封裝了該 php 腳本.
然后由 crontab 執(zhí)行該 bash 腳本,完成排期任務(wù).
編寫完成后,卻發(fā)現(xiàn) php 的日志文件始終沒有記錄到運行信息.
解決:
查看 /var/log/cron ,確認 crontab 配置已生效,bash 腳本已被調(diào)用.
單獨運行 bash 腳本,可正常工作.
單獨運行 php 腳本,可正常工作,并且日志打印羅輯也沒有錯誤.
在 bash 腳本中加入日志打印,發(fā)現(xiàn)在被 crontab 執(zhí)行時, bash 羅輯正常,唯獨 php 腳本沒有任何執(zhí)行痕跡.
最后決定認真看下 crontab 機制,發(fā)現(xiàn):
crontab 有自己的 PATH 機制,和用戶環(huán)境的 PATH 不是一回事.
crontab 的 PATH 要在 /etc/crontab 這個文件中去編輯,默認沒有 /usr/local/bin 這個路徑.
而所用服務(wù)器的 php 是編譯安裝的,安裝完成后手動將 php 解釋器 ln -s 到 /usr/local/bin 下了,卻沒有放在 /usr/bin 目錄下.
所以手動執(zhí)行 bash 腳本和 php 腳本都可以成功,但被 crontab 執(zhí)行就不成功,因為解釋器沒有找到...
知道原因,解決辦法就簡單了.
或者將解釋器路徑軟鏈到 crontab 可識別的路徑內(nèi);
或者編輯 /etc/crontab 將 /usr/local/bin 加入 PATH 內(nèi);
或者在 bash 腳本內(nèi)執(zhí)行 php 腳本時,用 php 解釋器的全路徑去執(zhí)行.
我采用了第三個,因為這樣減少了該 bash 腳本對于環(huán)境的依賴性,便于移植.
程序員開發(fā)節(jié)奏快,任務(wù)急,很多問題大家都是用到哪學(xué)到哪,不求甚解.
到后來會發(fā)現(xiàn),越來越多的問題都是基礎(chǔ)不扎實導(dǎo)致的.還是基礎(chǔ)最重要啊.