1. 程式人生 > >Linux Crontab 設定的定時任務沒有啟動的排查

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 檔案刪除掉,重新設定時任務,竟然神奇地可以正常執行了。原理還沒想通,不過至少可以正常執行了….