建立 Linux 環境的健康檢查腳本 文章首圖

建立 Linux 環境的健康檢查腳本

建立 Linux 環境的健康檢查腳本

在伺服器維護與 DevOps 實務中,監控系統的健康狀態是確保服務穩定性的關鍵。雖然 Prometheus、Zabbix 或 Datadog 等專業監控工具功能強大,但對於小型專案或快速診斷問題時,一個簡單、輕量且可自訂的 Shell 腳本往往能提供更直觀且即時的反饋。

本文將帶領中階 Linux 使用者,逐步建立一個名為 sys_health_check.sh 的健康檢查腳本。這個腳本將涵蓋 CPU、記憶體、磁碟空間以及網路連線性等核心指標,並提供清晰的輸出格式,方便整合至 Cron 排程或 CI/CD 流程中。

準備工作與腳本結構

首先,請在您的 Ubuntu 22.04 或 Debian 12 系統上建立一個目錄來存放腳本,並賦予執行權限。

mkdir -p ~/scripts
nano ~/scripts/sys_health_check.sh

接下來,我們將腳本分為四個主要區塊:環境變數設定、指標收集函數、格式化輸出以及主邏輯控制。

第一階段:定義顏色與基礎配置

為了讓輸出結果更易於閱讀,我們先定義 ANSI 顏色代碼,並設定一些基礎變數,例如警告閾值。

#!/bin/bash

# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 閾值設定
CPU_WARN_THRESHOLD=80
MEM_WARN_THRESHOLD=85
DISK_WARN_THRESHOLD=90

第二階段:實作核心檢查函數

我們需要撰寫函數來獲取各項資源的使用率。請注意,在 Ubuntu/Debian 系統中,top 命令的輸出格式較為複雜,因此我們使用 awk 來精確提取數值。

1. CPU 使用率檢查

利用 top 命令的非互動模式,我們可以取得 CPU 的空閒率,進而推算使用率。

check_cpu() {
    # 獲取 CPU 使用率 (100 - 空閒率)
    local cpu_idle=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | cut -d. -f1)
    local cpu_usage=$((100 - cpu_idle))

    if [ $cpu_usage -gt $CPU_WARN_THRESHOLD ]; then
        echo -e "${RED}[WARNING] CPU Usage: ${cpu_usage}%${NC}"
        return 1
    else
        echo -e "${GREEN}[OK] CPU Usage: ${cpu_usage}%${NC}"
        return 0
    fi
}

註:若您的系統未安裝 top,可改用 mpstat (需安裝 sysstat 套件)。

2. 記憶體使用率檢查

使用 free 命令是獲取記憶體資訊最標準的方式。我們關注的是實際使用的記憶體佔總可用記憶體的百分比。

check_memory() {
    local mem_total=$(free | awk '/^Mem:/ {print $2}')
    local mem_used=$(free | awk '/^Mem:/ {print $3}')
    local mem_usage=$(echo "$mem_used $mem_total" | awk '{printf "%.0f", ($1/$2)*100}')

    if [ $mem_usage -gt $MEM_WARN_THRESHOLD ]; then
        echo -e "${RED}[WARNING] Memory Usage: ${mem_usage}%${NC}"
        return 1
    else
        echo -e "${GREEN}[OK] Memory Usage: ${mem_usage}%${NC}"
        return 0
    fi
}

3. 磁碟空間檢查

檢查根目錄 / 的可用空間是防止因磁碟寫滿導致服務崩潰的重要步驟。

check_disk() {
    local disk_usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')

    if [ $disk_usage -gt $DISK_WARN_THRESHOLD ]; then
        echo -e "${RED}[WARNING] Disk Usage (/): ${disk_usage}%${NC}"
        return 1
    else
        echo -e "${GREEN}[OK] Disk Usage (/): ${disk_usage}%${NC}"
        return 0
    fi
}

4. 網路連線性檢查

簡單的 ping 測試可以確認伺服器是否具有基本的網路連通性。這裡我們 ping Google 的 DNS 伺服器作為測試目標。

check_network() {
    if ping -c 1 -W 2 8.8.8.8 > /dev/null 2>&1; then
        echo -e "${GREEN}[OK] Network Connectivity: OK${NC}"
        return 0
    else
        echo -e "${RED}[WARNING] Network Connectivity: FAILED${NC}"
        return 1
    fi
}

第三階段:整合與執行

最後,我們將所有函數整合到主流程中,並根據整體結果返回不同的退出碼,這對於自動化腳本至關重要。

main() {
    echo "========================================"
    echo "  System Health Check Report"
    echo "  Date: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "========================================"

    local exit_code=0

    check_cpu || exit_code=1
    check_memory || exit_code=1
    check_disk || exit_code=1
    check_network || exit_code=1

    echo "========================================"
    if [ $exit_code -eq 0 ]; then
        echo -e "${GREEN}Overall Status: HEALTHY${NC}"
    else
        echo -e "${RED}Overall Status: DEGRADED${NC}"
    fi
    echo "========================================"

    return $exit_code
}

# 執行主函數
main

完成編輯後,儲存檔案並賦予執行權限:

chmod +x ~/scripts/sys_health_check.sh
~/scripts/sys_health_check.sh

常見問題與解決方案

Q1: 腳本在 Cron 中執行時無法正確獲取 CPU 使用率? 這通常是因為 Cron 的環境變數與互動式 Shell 不同,導致 top 命令行為異常。建議在腳本中明確指定 top 的路徑,或使用 mpstat 替代。若使用 mpstat,請先執行 sudo apt install sysstat 安裝套件。

Q2: 如何將結果自動發送通知(如 Email 或 Slack)? 您可以在 main 函數的 Overall Status: DEGRADED 區塊後加入通知邏輯。例如,使用 mail 命令發送 Email,或使用 curl 呼叫 Slack Webhook。

if [ $exit_code -ne 0 ]; then
    echo "System degraded" | mail -s "Alert: $(hostname)" admin@example.com
    curl -X POST -H 'Content-type: application/json' \
    --data '{"text":"System Health Check Failed on '"$(hostname)"'"}' \
    https://hooks.slack.com/services/YOUR/WEBHOOK/URL
fi

小結

透過上述步驟,我們建立了一個輕量且功能完整的健康檢查腳本。這個腳本不僅幫助您快速掌握伺服器狀態,其模組化的設計也允許您輕易擴充更多檢查項目(如特定服務進程是否存在、SSL 憑證到期日等)。

建議將此腳本加入 Crontab,例如每 5 分鐘執行一次,並設定異常時的告警機制。這樣一來,即使您不在電腦前,也能在第一時間發現潛在問題,確保 Linux 環境的穩定運行。