總結:
處理問題之后,先把經驗總結一下,步驟可分為以下幾步:
1、檢查定時任務crontab服務是否已正常啟動,service crond status
2、檢查定時任務的命令是否有錯,如果執行了腳本,也需要檢查腳本是否有錯,特別是輸入輸出文件時注意文件的絕對路徑、腳本的執行權限,最好先手工執行以下腳本,確保腳本可正常執行。
3、檢查crond服務正常啟動,又看不出來自己的定時任務命令跟腳本命令有什么問題,那就只能一步步看日志去排查問題了。
為了節省篇幅,下文隱去了1、2兩個步驟的操作。
處理過程:
安裝了一個postgres數據庫,為了備份數據庫,就寫了個備份腳本,在執行crontab -e添加定時任務,結果發現/var/log/cron日志中有相關記錄,但是無報錯信息。
但是執行並沒有成功。
一般情況下,當定時任務執行失敗時,如果沒有屏蔽錯誤時,系統會發送一個系統郵件到/var/spool/mail/root,但是仔細一開下面那條日志,發現發送日志失敗了:
所以日志並沒有生成,此時去需要去查看郵件日志/var/log/maillog,
百度一下找到解決方案:
vi /etc/postfix/main.cf
修改inet_interfaces參數值為all
此時需要注意上面的提示,修改參數之后需重啟postfix服務,
service postfix restart
處理完發送系統郵件的問題之后,就可以去查看定時任務失敗的郵件了,為了快速產生郵件,可以設置定時任務一分鍾執行一次,等問題解決之后在調整為正常周期。
vi /var/spool/mail/root
此時發現了是postgres命令找不到,查看定時任務找到哪里使用了這條命令,如果定時命令中執行了腳本,那么也需要檢查腳本內容:
crontab -e
發現了是自己填寫的定時任務有問題,root通過直接編輯/etc/crontab文件的方式來添加定時任務時,可以指定執行用戶,但是如果使用了crontab -e來添加的任務,是沒有指定執行用戶這個參數的,因此我這樣寫的定時任務,會把postgres認為是一個命令,然后報錯命令不存在,無法執行,此時只需要把postgres去掉即可
然后查看日志/var/log/cron就可以看到定時任務正常執行,不再產生郵件