cron、sendmail、postdrop
最近有一臺centos7服務器故障,通過排查發現是cron致使的,具體以下:html
- 情景1:因cron錯誤觸發sendmail進程發送告警郵件(沒有配置郵件服務器),郵件發送失敗,進而觸發postdrop進程,這個操做會不斷累積,最終致使內存/innode號資源不足;
- 情景2:postdrop失敗會有警告信息生成,保存在/var/spool/postfix/maildrop,通過一段時間的累積,最終致使磁盤資源不足;
fix情景1:
- 檢查mem佔用狀況,發現大量的CRON——sendmail——postdrop進程;
- 先解決燃眉之急,直接
pkill postdrop
釋放內存和innode資源,可是幾天後又出現一樣的問題;
- why 有這麼多的postdrop進程呢?
- 查看系統日誌發現有執行失敗的cron,因而問題開始浮出水面(如情景1中所述);
- how to fix it?
- 先寫了一個腳本監控sendmail進程的啓動頻率:
while true
do
date +%H:%M:%S >> 1.txt
ps -e | grep sendmail | wc >>1.txt
sleep 5
done
- 結果發現每10分鐘就會啓動一個sendmail進程,查看其用戶爲internal(一個普通用戶);
- 上面講到和cron有關,因而就先排查
crontab -l -uinternal
,果真開發本身寫了定時任務(按規定是禁止開發手動添加定時任務的),上網查到最簡單直接的fix辦法就是在定時任務首行加上參數「MAILTO=""」;
- 過來幾天查看服務器狀態,發現又有不少sendmail進程,why?此時查看/etc/cron.d下的cron,發現這裏也有使用internal用戶執行的定時任務,因而再次使用上述方法;
- 心想,總不能隨時都這樣手動fix吧,並且普通用戶那麼多,cron文件也不少,這。。。進一步查資料發現以下內容:
MAILTO是針對用戶配置的,因而將該參數加入/var/spool/cron/internal下;
- 經檢驗發現,上面的操做一樣對/etc/cron.d下的定時任務不生效、、、GG;
- 再次搜索,參考解決辦法以下:
/etc/cron.d下面有一個sysstat定時任務腳本,crond會自動讀取其中的配置信息,正好這個文件裏有一個項就是每10分鐘執行一次systat軟件包的命令,測試代表這個命令因爲所寫日誌文件不存在而致使報錯,一旦報錯,crond就會sendemail(無論MAILTO的值如何?)。在這條命令後面加上 &>/dev/null後,發現crond再也不啓動sendmail進程。
原來內容:
# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A
其中的命令會報錯:
[root@lcha2 root]# /usr/lib/sa/sa1 1 1
Cannot open /var/log/sa/sa20: No such file or directory
修改後:
# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib/sa/sa1 1 1 &>/dev/null
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A &>/dev/null
參考:
https://blog.csdn.net/liang100k/article/details/53634809
https://blog.csdn.net/dodott/article/details/53907518
https://www.aliyun.com/jiaocheng/200151.htmlnode
心得體會
- 日誌文件是系統分析的關鍵,要確保全部日誌文件目錄可用,若是不可用,syslogd不會自動建立它們,也就失去了記錄日誌的機會!
- crond,logrotate,syslogd相互配合
- crond和sendmail的關係絕非通常,crontab中MAILTO設置了空,crond仍然會調用sendmail發送郵件,解決方式是把crond執行的命令最後加上 &> /dev/null。
- 多動手測試,熟練使用bash命令。
fix情景2:
- 先清理垃圾文件釋放磁盤資源;
- 而後仍是由於錯誤cron的緣由,迴歸到情景1。
終極fix
後續通過不斷的搜索,找到以下方法完全解決了上述問題:centos
- 方法1: 使用crond服務的內置參數「-s」,其功能是將郵件發送失敗後的錯誤輸出到syslog,對於系統日誌配置了logrotate規則,因此不會形成垃圾文件無限制堆積。可是該方法存在的弊端是,在syslog中會有大量垃圾文件,不利於運維管理。
- 方法2: 使用crond服務的「-m off」參數,其做用是關閉crond郵件發送功能,這樣能夠更加優雅的解決問題。