Linux Crontab 設定的定時任務沒有啟動的排查
1、先手動執行定時任務以此來判斷指令碼是否有問題。
2、確認伺服器是否開啟定時任務計劃服務
命令:service crond status
service crond start
3、檢查定時任務配置的語法
crontab -l
SHELL=/bin/bash
0 15 * * 1-5 cd /root/ye/project/StatShareDataProject/&& ./start.sh
可直接複製cd /root/ye/project/StatShareDataProject/&& ./start.sh來執行,若可以正常執行再另做判斷。
4、 檢視crontab執行記錄
如果出現了crontab定時任務不執行的情況,首先需要定位問題,那麼就需要通過日誌來確定問題所在。
crontab的日誌位置一般位於/var/log/cron,利用下面的語句即可檢視日誌。
tail -f /var/log/cron
上面的/var/log/cron只會記錄是否執行了某些計劃的指令碼,但是具體執行是否正確以及指令碼執行過程中的一些資訊linux會通過郵件形式傳送到給該使用者。
對於root使用者該郵件記錄位於/var/spool/mail/root,通過以下命令可以檢視最近的crontab執行情況。
tail -f /var/spool/mail/root
mail郵件一般只會記錄指令碼執行成功與否,如果執行失敗,無法給出進一步的錯誤資訊,這時需要我們將語句執行的錯誤資訊重定向至檔案中,這樣可以很方便的檢視錯誤資訊。下面就給出了一個簡單的例子
0 6 * * * /root/script/ss.sh >> /root/for_crontab/mylog.log 2>&1
上述語句表示把錯誤輸出和標準輸出都輸出到mylog.log中,在執行的時候會將命令執行的相關資訊記錄至mylog.log檔案中。
- 注:通過定時任務執行的程式需要手動將其 stop 掉(就算該程式手動執行只需要幾秒就可執行完了,但是通過crontab設定成定時任務執行時,其執行後將一直佔有著該執行緒,並且不會因為程式跑完了就自動停止該執行緒),要不然在下次再執行時會發現原先的程式還在執行中。
有些時候可能是路徑問題,比如筆者寫了個定時任務同步伺服器時間如下所示:
每天定時同步服務時間
0 3 * * * root ntpdate -u 10.xx.xx.xx
如上寫法,定時任務會定時執行,但是實際上並沒有正常同步時間。手動複製上述命令(ntpdate -u 10.xx.xx.xx)則可以正常同步時間。筆者修改成如下所示一切就正常了
0 3 * * * /usr/sbin/ntpdate -u 10.xx.xx.xx
- 增加了crontab任務後,在/var/spool/cron目錄下會有一個當前登入賬號命名的檔案。比如我的登入賬號是root。則會存在一個root檔案。該檔案的內容就是剛新增的crontab任務。
常見錯誤一:
定時任務配置好後,正常執行,但是執行過程中出現如下錯誤
nohup: failed to run command ‘java’: No such file or directory
解決方法:
往執行指令碼中新增如下命令便可,這是因為cron並沒有載入java相關的配置檔案,所以我們需要在指令碼中手動將其加入。
source /etc/profile
新增後腳本整體如下
#!/bin/bash
source /etc/profile
PROJECTNAME=UseAndUnuseData
pid=`ps -ef |grep $PROJECTNAME |grep -v "grep" |awk '{print $2}'`
if [ $pid ]; then
echo "$PROJECTNAME is running and pid=$pid"
kill -9 $pid
echo "Start success to start $PROJECTNAME ...."
nohup java -jar UseAndUnuseData.jar >> catalina.out 2>&1 &
else
echo "Start success to start $PROJECTNAME ...."
nohup java -jar UseAndUnuseData.jar >> catalina.out 2>&1 &
fi
遇到的一個坑:
定時任務如下:
crontab -e
#週一到週五每天下午三點開始執行程式,統計基本資料
01 15 * * 1-5 cd /root/yechunbo/project/StaticBasicData/&& ./start.sh
手動執行正常,但是定時任務執行出錯,具體錯誤如下所示:
/bin/sh: root: command not found
按照網上各種方法試過之後發現還是報一樣的錯。
因此筆者將/var/spool/cron/root 檔案刪除掉,重新設定時任務,竟然神奇地可以正常執行了。原理還沒想通,不過至少可以正常執行了….