建立 Linux 上的監控告警系統 文章首圖

建立 Linux 上的監控告警系統

建立 Linux 上的監控告警系統

在日常的系統管理工作中,「當機後才知道出問題」是最令人頭痛的情境。對於中階 Linux 使用者而言,建立一套輕量、即時且可靠的監控告警系統,是確保服務穩定性的關鍵。雖然 Prometheus 或 Zabbix 等企業級解決方案功能強大,但它們架構複雜,對於小型專案或個人伺服器而言,往往顯得過於沉重。

本文將引導你使用 Linux 內建的 cron 排程器搭配 curl 與簡單的 Shell 腳本,搭建一套基於 Webhook 的即時告警系統。這種方法無需安裝額外軟體,資源佔用極低,且能透過 Telegram Bot 或 Slack 等工具將警報直接推送到手機,讓你能在第一時間掌握伺服器狀態。

第一步:設定通知渠道

在撰寫監控腳本之前,我們需要先準備好接收告警的地方。這裡以 Telegram Bot 為例,因為它設定簡單且支援跨平台推送。

  1. 在 Telegram 中搜尋 @BotFather,發送 /newbot 建立一個新機器人,並取得你的 API Token
  2. 開啟你的 Telegram 帳號,發送訊息給機器人,然後在瀏覽器訪問 https://api.telegram.org/bot<你的API_TOKEN>/getUpdates,從回傳的 JSON 中找到你的 chat_id(一串數字)。

接下來,我們測試一下通知是否暢通。在終端機執行以下指令:

curl -s -X POST https://api.telegram.org/bot<你的API_TOKEN>/sendMessage \
     -d chat_id=<你的chat_id> \
     -d text="測試訊息:監控系統啟動成功!"

若手機收到訊息,表示通知管道已就緒。

第二步:撰寫監控腳本

現在我們來建立核心的監控腳本。這個腳本將檢查 CPU 負載、記憶體使用率以及硬碟空間。請在 /usr/local/bin 下建立一個名為 sys_monitor.sh 的文件:

sudo nano /usr/local/bin/sys_monitor.sh

輸入以下內容:

#!/bin/bash

# 設定變數
CHAT_ID="<你的chat_id>"
BOT_TOKEN="<你的API_TOKEN>"
SERVER_NAME=$(hostname)

# 定義發送訊息函數
send_alert() {
    local message="$1"
    curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
         -d chat_id="${CHAT_ID}" \
         -d text="⚠️ [${SERVER_NAME}] 警報:${message}"
}

# 1. 檢查 CPU 負載 (1分鐘平均負載)
LOAD=$(cat /proc/loadavg | awk '{print $1}')
# 假設伺服器為 4 核心,若負載超過 3.5 則視為高負載
if (( $(echo "$LOAD > 3.5" | bc -l) )); then
    send_alert "CPU 負載過高:${LOAD}"
    exit 0
fi

# 2. 檢查記憶體使用率
MEM_TOTAL=$(free | grep Mem | awk '{print $2}')
MEM_USED=$(free | grep Mem | awk '{print $3}')
MEM_PERCENT=$(echo "scale=2; $MEM_USED * 100 / $MEM_TOTAL" | bc)

if (( $(echo "$MEM_PERCENT > 90" | bc -l) )); then
    send_alert "記憶體使用率過高:${MEM_PERCENT}%"
    exit 0
fi

# 3. 檢查根目錄磁碟空間
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')

if [ "$DISK_USAGE" -gt 85 ]; then
    send_alert "磁碟空間不足:${DISK_USAGE}%"
    exit 0
fi

# 若一切正常,可選擇性發送每日健康報告(可選)
# send_alert "✅ [${SERVER_NAME}] 每日健康檢查通過"

儲存後,務必賦予執行權限:

sudo chmod +x /usr/local/bin/sys_monitor.sh

第三步:自動化排程

為了讓監控持續運作,我們使用 cron 來定時執行腳本。建議每 5 分鐘檢查一次,以平衡即時性與系統資源。

編輯 crontab:

crontab -e

在檔案末尾加入以下行:

*/5 * * * * /usr/local/bin/sys_monitor.sh

這樣設定後,系統將每 5 分鐘自動執行一次檢查。若有任何指標超出閾值,你將立即收到 Telegram 通知。

常見問題與解決辦法

1. 腳本執行時報錯 bc: command not found 這是因為 Debian/Ubuntu 預設未安裝 bc 數學運算工具。請執行 sudo apt install bc 即可解決。若不想安裝額外套件,可改用 awk 進行浮點數比較,例如:awk "BEGIN {exit !($LOAD > 3.5)}"

2. 收到重複告警訊息 若伺服器短暫負載波動,可能導致連續告警。建議在腳本中加入「防抖動」邏輯,例如檢查上次告警時間,或在收到告警後將結果寫入暫存檔案,若狀態未恢復則不重複發送。

小結

透過上述步驟,我們成功搭建了一套輕量級的 Linux 監控告警系統。這種方法不僅免去了安裝龐大監控軟體的負擔,更讓你能靈活客製化監控項目。對於中階使用者而言,理解如何結合內建工具與外部 API 進行自動化,是提升系統管理效率的重要一步。未來,你可以根據需求擴展監控項目,例如加入 Docker 容器狀態檢查或特定 Port 的連線監聽,讓你的伺服器管理更加得心應手。