建立 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 環境的穩定運行。