建立 Linux 監控告警的完整方案
在伺服器運維的日常工作中,「故障發生時的第一時間得知」是確保系統穩定性的關鍵。許多初學者習慣手動檢查日誌或定期登入伺服器查看狀態,這不僅效率低落,更可能因為睡眠或休假而錯過黃金處理時間。對於具備基礎 Linux 知識的中階使用者而言,建立一套自動化、輕量級且可靠的監控告警系統,是提升運維效率的必經之路。
本文將介紹如何結合 Linux 內建的 cron排程工具與簡單的 Shell 腳本,在 Ubuntu 22.04 或 Debian 12 環境下,快速搭建一套針對 CPU、記憶體與磁碟空間的監控告警方案。
第一步:安裝郵件發送環境
告警的核心在於「通知」。在 Linux 伺服器上,最原生且輕量的通知方式莫過於電子郵件。我們可以使用 mailutils 套件來簡化郵件發送流程。
首先,更新套件清單並安裝相關工具:
sudo apt update
sudo apt install -y mailutils postfix
安裝過程中會提示選擇 Postfix 類型,選擇「Internet Site」即可,並輸入你的網域名稱。若你的伺服器無法直接發送外部郵件(例如在內部網路或雲端環境),建議改用 ssmtp 搭配外部 SMTP 服務(如 Gmail 或 SendGrid),但為了本文簡潔性,此處假設伺服器具備直接發信能力。
測試郵件是否發送成功:
echo "測試郵件內容" | mail -s "測試主題" your_email@example.com
若能在收件匣收到郵件,代表郵件環境已就緒。
第二步:撰寫監控腳本
接下來,我們需要一個腳本來收集系統狀態並判斷是否觸發告警。請建立一個名為 sys_monitor.sh 的檔案:
sudo nano /usr/local/bin/sys_monitor.sh
輸入以下內容。這段腳本會檢查磁碟使用率是否超過 90%,若超過則發送告警郵件:
#!/bin/bash
# 設定告警閾值
DISK_THRESHOLD=90
ALERT_EMAIL="your_email@example.com"
# 取得磁碟使用率 (移除百分比符號)
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# 檢查磁碟空間
if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
SUBJECT="告警:${HOSTNAME} 磁碟使用率過高 (${DISK_USAGE}%)"
BODY="伺服器 ${HOSTNAME} 的根目錄磁碟使用率已達到 ${DISK_USAGE}%,請盡快處理。"
echo "$BODY" | mail -s "$SUBJECT" "$ALERT_EMAIL"
echo "[$(date)] 磁碟告警已發送" >> /var/log/sys_monitor.log
fi
# 檢查 CPU 負載 (簡單範例:檢查 1 分鐘平均負載是否大於 CPU 核心數的 1.5 倍)
CPU_CORES=$(nproc)
LOAD_AVG=$(cat /proc/loadavg | awk '{print $1}')
THRESHOLD=$(echo "$CPU_CORES * 1.5" | bc)
if (( $(echo "$LOAD_AVG > $THRESHOLD" | bc -l) )); then
SUBJECT="告警:${HOSTNAME} CPU 負載過高 ($LOAD_AVG)"
BODY "伺服器 ${HOSTNAME} 的 1 分鐘平均負載為 $LOAD_AVG,核心數為 $CPU_CORES。"
echo "$BODY" | mail -s "$SUBJECT" "$ALERT_EMAIL"
echo "[$(date)] CPU 告警已發送" >> /var/log/sys_monitor.log
fi
儲存後,賦予執行權限:
sudo chmod +x /usr/local/bin/sys_monitor.sh
第三步:設定定時任務
使用 cron 讓系統定期執行此腳本。我們設定每 5 分鐘檢查一次,對於大多數非即時高頻場景已足夠:
crontab -e
在開啟的編輯器中,加入以下行:
*/5 * * * * /usr/local/bin/sys_monitor.sh
常見問題與解決
1. 郵件發送失敗或進入垃圾郵件匣 許多雲端供應商預設封鎖了 25 埠(SMTP)以防止濫發郵件。若測試郵件無法收到,請檢查伺服器防火牆設定,或改用 587 埠(STARTTLS)搭配外部 SMTP 伺服器。此外,確保郵件內容包含明確的主題與伺服器名稱,避免被過濾系統攔截。
2. 腳本執行權限或環境變數問題
cron 環境與使用者登入環境不同,缺少某些 PATH 變數。因此,腳本中的指令應使用絕對路徑(如 /bin/df),或在腳本開頭明確設定 PATH。若腳本無法執行,可檢查 /var/log/syslog 或 mail.log 以獲取詳細錯誤訊息。
小結
透過上述步驟,我們利用 Linux 原生工具建立了一套基礎但有效的監控告警系統。這套方案雖然簡潔,卻涵蓋了運維中最核心的兩個資源:儲存與運算。對於更進階的需求,您可以將此腳本作為基礎,整合 Prometheus 或 Zabbix 等專業監控平台,或加入記憶體交換空間(Swap)的監控邏輯。記住,監控的目的不是為了製造警報,而是為了在問題擴大前,為您爭取寶貴的處理時間。