任務目標是每隔一段時間將某 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 指令碼對於環境的依賴性,便於移植.
程式設計師開發節奏快,任務急,很多問題大家都是用到哪學到哪,不求甚解.
到後來會發現,越來越多的問題都是基礎不紮實導致的.還是基礎最重要啊.
crontab 只執行一次 crontab使用方法
如果你 假裝 對工作感興趣,這種態度往往會使你的興趣弄假成真。這種態度還能減少疲勞 緊張和憂慮。除了身體的運動,我們更需要的是精神 心智上的運動,以便促使我們付諸行動。每天時時跟自己交談,可以引導自己思考什麼是勇氣和幸福,什麼是平安和力量 每天跟自己談些需要感謝的事,這樣,你的心靈就會海闊天空,快樂...
crontab每小時執行一次
先給出crontab的語法格式 對於網上很多給出的每小時定時任務寫法,可以說絕大多數都是錯誤的!比如對於下面的這種寫法 00 每隔一小時執行一次 00 1 與上面是相同的任務 這種是正確的嗎?對照最前面給出的語法格式來看,這個定時任務在0分 每小時 每天 每月 每星期執行,看起來似乎很合理啊?前乙個...
crontab每小時執行一次
先給出crontab的語法格式 對於網上很多給出的每小時定時任務寫法,可以說絕大多數都是錯誤的!比如對於下面的這種寫法 00 每隔一小時執行一次 00 1 與上面是相同的任務 這種是正確的嗎?對照最前面給出的語法格式來看,這個定時任務在0分 每小時 每天 每月 每星期執行,看起來似乎很合理啊?前乙個...