
第一步:使用命令查看日志
# -b -1 表示查看上一次啟動(dòng)的日志 # -p err 僅過濾錯(cuò)誤信息 journalctl -b -1 -p err
發(fā)現(xiàn)日志沒有存儲(chǔ),journalctl 報(bào)錯(cuò):未開啟持久化存儲(chǔ)

解決方法(開啟持久化):你需要手動(dòng)創(chuàng)建日志目錄并重啟服務(wù),以后死機(jī)就能看了:
Bashmkdir -p /var/log/journal
systemctl restart systemd-journald
第二步:
這是排查死機(jī)最直接的辦法,查看死機(jī)時(shí)間點(diǎn)前后的記錄:
Bash# CentOS/RHEL/Ubuntu 均適用
tail -n 500 /var/log/messages # 或者 /var/log/syslog
第三步:查看歷史備份
# 查看所有 messages 相關(guān)的歷史文件 ls -lh /var/log/messages*
尋找被“踢”走的舊日志
ls -ltr /var/log/messages*

從截圖來看,線索非常清晰了:
當(dāng)前的 /var/log/messages 文件大小高達(dá) 361MB,且最后修改時(shí)間是 09:55。而之前的備份還是 5月4日的。
這意味著:從 5月4日到今天(5月8日)死機(jī)重啟前的所有日志,全部都堆在這個(gè) 361MB 的文件里。 之前用的 tail -n 500 只看到了重啟后的“冰山一角”。
我們要過濾掉重啟后的內(nèi)容,看重啟前那幾秒發(fā)生了什么。請(qǐng)執(zhí)行:
grep -B 100 "May 8 09:45" /var/log/messages | head -n 100

抓到“真兇”了!這張截圖非常有價(jià)值,它解釋了為什么你的日志文件會(huì)迅速膨脹到 361MB,以及服務(wù)器為什么會(huì)死機(jī)。
日志顯示在 09:41:39(死機(jī)前幾分鐘),系統(tǒng)在一秒鐘內(nèi)瘋狂產(chǎn)生了幾十條甚至上百條報(bào)錯(cuò):postdrop: warning: mail_queue_enter: create file maildrop/XXXXX: Permission denied
這意味著:
日志洪泛 (Log Flooding):某個(gè)定時(shí)任務(wù)(crond)觸發(fā)了腳本,該腳本嘗試發(fā)送郵件,但郵件系統(tǒng)(Postfix)的權(quán)限有問題。
資源耗盡:這種頻率的報(bào)錯(cuò)會(huì)產(chǎn)生極高的 磁盤 I/O 負(fù)載 和 CPU 消耗。如果這種情況持續(xù)了整整幾分鐘,服務(wù)器會(huì)因?yàn)?CPU 被這種無意義的報(bào)錯(cuò)占滿,或者磁盤 I/O 堵塞而徹底失去響應(yīng)(表現(xiàn)為死機(jī))。
最常見的原因是 Postfix 權(quán)限損壞。通常發(fā)生在系統(tǒng)非正常關(guān)機(jī)、強(qiáng)制斷電或磁盤滿過一次之后,導(dǎo)致郵件隊(duì)列目錄的權(quán)限不正確。
請(qǐng)依次執(zhí)行以下命令來修復(fù)這個(gè)問題,防止再次死機(jī):
這是最直接的修復(fù)方法:
postfix check postfix set-permissions systemctl restart postfix
如果郵件隊(duì)列里塞滿了發(fā)不出去的垃圾報(bào)錯(cuò),請(qǐng)清空它:
postsuper -d ALL
報(bào)錯(cuò)源頭是 crond[819]。通常是因?yàn)槟愕哪硞€(gè)計(jì)劃任務(wù)腳本有輸出信息,系統(tǒng)默認(rèn)會(huì)把這些輸出通過郵件發(fā)給 root。 你可以檢查 /etc/crontab 或用戶的 crontab:
crontab -l
你的 /var/log/messages 已經(jīng) 361MB 了,修復(fù)完權(quán)限后,建議手動(dòng)清理一下日志防止磁盤撐爆:
cat /dev/null > /var/log/messages
如何關(guān)閉關(guān)閉Postfix 郵件服務(wù)呢?
如果你確定服務(wù)器不需要發(fā)送系統(tǒng)告警郵件、Cron 任務(wù)報(bào)告或通過 sendmail 接口外發(fā)郵件,直接關(guān)閉并禁用 Postfix 是最徹底、最節(jié)省資源的做法。這也能杜絕以后再出現(xiàn)類似的日志轟炸問題。
以下是完整操作步驟:
執(zhí)行以下兩條命令,立即停止服務(wù)并防止它在下次開機(jī)時(shí)自動(dòng)啟動(dòng):
# 停止當(dāng)前運(yùn)行的服務(wù) systemctl stop postfix # 禁止開機(jī)自啟動(dòng) systemctl disable postfix
確認(rèn)服務(wù)已處于 inactive (dead) 狀態(tài)且為 disabled:
systemctl status postfix
既然不再使用郵件服務(wù),之前的報(bào)錯(cuò)隊(duì)列也可以清理干凈:
rm -rf /var/spool/postfix/maildrop/*
你之前的日志文件已經(jīng) 361MB 了,建議執(zhí)行以下命令清空它,釋放空間并讓以后的排查更清爽:
# 清空 messages 文件(不刪除文件,只清空內(nèi)容) true > /var/log/messages
關(guān)閉 Postfix 后,你的系統(tǒng)將不再具備發(fā)送本地/遠(yuǎn)程郵件的功能。對(duì)于普通的業(yè)務(wù)服務(wù)器,這通常沒有影響。但如果你依賴系統(tǒng)自動(dòng)發(fā)送“磁盤空間不足”或“備份失敗”的郵件告警,請(qǐng)務(wù)必考慮使用外部監(jiān)控工具(如 Prometheus、Zabbix 或云監(jiān)控)作為替代方案。
為了確保服務(wù)器徹底恢復(fù)“清凈”并騰出空間,建議完成以下最后兩步:
雖然服務(wù)停了,但舊的報(bào)錯(cuò)還在文件里占用空間。清空它:
Bashtrue > /var/log/messages
雖然 Postfix 停了,但由于 crond 依然會(huì)嘗試發(fā)送腳本的輸出,它可能會(huì)在日志里報(bào)錯(cuò)說 sendmail 找不到。
最優(yōu)雅的解決辦法: 修改 /etc/crontab 或執(zhí)行 crontab -e,在文件頂部添加一行配置,告訴 Cron 不要發(fā)郵件:
BashMAILTO=""
這樣即便你的腳本有輸出,Cron 也會(huì)直接丟棄,不再調(diào)用任何郵件組件。
有關(guān)我們服務(wù)的更多信息,請(qǐng)聯(lián)系項(xiàng)目經(jīng)理
15899750475 楊先生