1. 程式人生 > >crontab排程失敗一例總結

crontab排程失敗一例總結

生產環境中,crontab呼叫指令碼失敗,導致任務未執行。

31 14 * * * (datetime=`date +'%Y%m%d %H:%M:%S'`;echo $datetime >> ~/a.log)

1、初步判斷crontab是否對反斜點(`)不支援;

查到資料crontab常見問題,指出crontab不支援命令中包含%,在crontab中%是有特殊含義的,表示換行的意思。

2、簡單驗證

  • 失敗案例
31 14 * * * (date +'%Y%m%d %H:%M:%S' >> ~/a.log)
31 14 * * * (datetime=`date +'%Y%m%d %H:%M:%S'`;echo $datetime >> ~/a.log)
  • 成功案例
31 14 * * * (date +'\%Y%\m\%d \%H:\%M:\%S' >> ~/a.log)
31 14 * * * (datetime=`date +'\%Y\%m\%d \%H:\%M:\%S'`;echo $datetime >> ~/a.log)

2、最終結論

1)新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。
2)每條 JOB 執行完畢之後,系統會自動將輸出傳送郵件給當前系統使用者。日積月累,非常的多,甚至會撐爆整個系統。所以每條 JOB 命令後面進行重定向處理是非常必要的: >/dev/null 2>&1 。前提是對 Job 中的命令需要正常輸出已經作了一定的處理, 比如追加到某個特定日誌檔案。
3)當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者檢視日誌看某個job有沒有執行/報錯tail -f /var/log/cron。
4)千萬別亂執行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除使用者的Crontab檔案。刪除了該使用者的所有crontab都沒了。
5)在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%,如經常用的date ‘+%Y%m%d’在crontab裡是不會執行的,應該換成date ‘+\%Y\%m\%d’`。