錯誤cron致使linux宕機

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文件也不少,這。。。進一步查資料發現以下內容: 20180629153024368483211.png
    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郵件發送功能,這樣能夠更加優雅的解決問題。
相關文章
相關標籤/搜索