手動執行腳本正常,定時任務總是不執行解決方案:
-
首先檢查
crond
任務是否正常:service crond status
重啓下定時任務:service crond stop、service crond start 、service crond restart
-
在調度的腳本中加載環境變量試試 腳本中添加
source /etc/profile
在crontab -e
編輯定時任務時加上./etc/profile;
與在腳本里加 source /etc/profile
效果一樣,例如0 6 * * * ./etc/profile;sh /home/hadoop/ktl_wks/start_1.sh
。
crontab
其實並不知道定時腳本所需要的特殊環境,所以在腳本中要提供所有必要的路徑和環境變量,要注意以下:
- 腳本中涉及文件路徑時寫全局路徑
- 腳本執行要用到java或其他環境變量時,通過source命令引入環境變量
- 當手動執行腳本OK,但是
crontab
不執行時。一般都是環境變量惹的禍,可以嘗試在crontab
中直接引入環境變量或者在腳本中加載環境變量解決問題 - 新創建的定時任務,至少要過2分鐘纔可以執行,如果重啓
crontab
則可以馬上執行。 - 每條定時任務執行完畢之後,系統會自動將輸出發送郵件給當前系統用戶。日積月累,會給系統造成負擔, 所以每條定時任務命令後面最好進行重定向處理(定時任務執行的結果正常輸出並已經作了一定的處理,,例如追加到某個特定日誌文件):
>/dev/null 2>&1
例如0 8 * * * /home/hadoop/ktl_wks/start_JXC_DD.sh >> /home/hadoop/ktl_wks/start_JXC_DD_run.log 2>&1
。 - 當
crontab
突然失效時,可以嘗試/etc/init.d/crond restart
解決問題。或者查看定時任務日誌看是否有執行報錯:tail -100f /var/log/cron
。 - 在
crontab
中%
是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%
,所以date +%Y%m%d
在crontab
裏是不會執行的,要換成date +\%Y\%m\%d
。 - 命令
crontab -r
會刪除該用戶的所有crontab
定時任務。刪除crontab
目錄/var/spool/cron
中用戶的Crontab
文件,定時任務就沒有了,所以這個命令危險性很大。