我們經常會需要使用crontab進行定時任務,但crontab不能成功執行指令碼的情況還是很常見,總結起來,本人了解到的和自己遇到的可能原因主要有以下幾個:
1. crond程序不存在,該程序是crontab的守護程序,它必須存在才能讓crontab正常使用;
2. 系統時間不對;
3. 環境變數的問題:crontab執行指令碼的時候不會讀取使用者的環境變數等配置,所以可能很多命令不能使用導致指令碼執行失敗;
4. 指令碼本身的問題。
針對以上幾點,在使用crontab之前,我們應該:
1. 檢查crond程序是否正在正常執行;
2. 這個很少見,畢竟大多數情況我們的時間都很標準,不過要是用不熟悉的機器,最好還是date一下;
3. 這個應該是最容易出現的問題了,針對這種問題:
a. 在編寫shell指令碼的時候盡量用絕對路徑使用命令;
b. 在指令碼開頭export一下路徑(長見的命令一般在/bin,/sbin,/usr/bin,/usr/sbin這幾個路徑下,所以不妨全部export一下:export path=$path:/bin:/sbin:/usr/bin:/usr/sbin,如果不全部export的話,記得把使用到的命令which一下以確定命令的真實路徑;
c. 使用指令碼呼叫別的指令碼,比如有三個指令碼:run1.sh,run2.sh,run3.sh,假設這三個指令碼都使用了cat、grep等命令,那麼它們直接放在crontab中是不會被成功執行的,這時候我們可以寫個run.sh,在run.sh中呼叫run1.sh,run2.sh,run3.sh,這樣就不需要考慮export環境變數的問題,因為run.sh並沒有使用系統命令,而run.sh呼叫run1.sh的時候已經不是crontab在管理了,所以會讀取使用者的環境變數。
4. 拉出去槍斃吧,只能自己檢查問題了,可以先手動執行一次,如果成功執行再考慮crontab相關的問題,不然諸如沒有+x就放進crontab的問題肯定是不該的。
總之,前兩個問題比較好查,而後兩個問題,我們可以通過在指令碼開頭打log等方式確定是指令碼沒有執行還是沒有成功執行到結束。
**:
crontab不能成功執行shell指令碼的可能原因
我們經常會需要使用crontab進行定時任務,但crontab不能成功執行指令碼的情況還是很常見,總結起來,本人了解到的和自己遇到的可能原因主要有以下幾個 1.crond程序不存在,該程序是crontab的守護程序,它必須存在才能讓crontab正常使用 2.系統時間不對 3.環境變數的問題 cro...
Entity Framework不能成功更新資料
最近在練習剛掌握的asp.net mvc開發技能,於是寫了乙個簡單的頁面程式。但是,總是無法成功更新資料,看著自己的更新 update 函式總是失敗,研究了幾天之後,求助谷歌終於得出了結果。entity framework更新資料函式,傳入的模型不能是自己通過new新建的資料模型,而應該是通過get...
crontab定時器執行 sh指令碼
linux 的crontab,執行shell指令碼的時候,異常問題整理 28 15 sh bx sqoop startall.sh create all 2 1 home user sh starts logs sqoop upload date y m d log bin bash sqoop 讀...