寫一個伺服器健康檢查腳本 文章首圖

寫一個伺服器健康檢查腳本

寫一個伺服器健康檢查腳本

在日常的系統管理工作中,我們常常需要確認伺服器是否運作正常。對於擁有數台伺服器的管理員來說,手動登入每台機器檢查狀態不僅耗時,還容易遺漏細節。透過撰寫自動化腳本,我們可以將這些重複性的檢查工作一鍵完成,並即時獲取伺服器整體的健康狀況。本文将介紹如何使用 Shell 腳本,在 Ubuntu 22.04 或 Debian 12 系統上,建立一個簡單但實用的伺服器健康檢查工具。

腳本設計邏輯

一個基礎的健康檢查腳本應涵蓋以下幾個核心維度:

  1. 系統資訊:主機名稱、運行時間、當前使用者。
  2. 資源使用率:CPU 負載、記憶體用量、磁碟空間。
  3. 服務狀態:關鍵服務(如 SSH、Nginx 或 Docker)是否正在運行。
  4. 網路連線:對外連線是否正常。

我們使用 Bash 腳本結合 uptimefreedfps 等標準 Linux 指令來實現這些功能。為了讓輸出結果更直觀,我們將加入顏色標記,讓異常狀態一目瞭然。

完整腳本程式碼

請在您的伺服器上建立一個名為 server_health_check.sh 的檔案,並貼入以下內容:

#!/bin/bash

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

# 檢查 root 權限
if [ "$EUID" -ne 0 ]; then
  echo -e "${RED}[錯誤] 請使用 root 權限執行此腳本 (sudo ./server_health_check.sh)${NC}"
  exit 1
fi

echo "========================================"
echo "  伺服器健康檢查報告"
echo "  主機名稱: $(hostname)"
echo "  檢查時間: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
echo ""

# 1. 系統基本資訊
echo -e "${GREEN}[系統資訊]${NC}"
echo -e "  運行時間: $(uptime -p)"
echo -e "  核心版本: $(uname -r)"
echo ""

# 2. CPU 負載檢查
echo -e "${GREEN}[CPU 負載]${NC}"
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | sed 's/ //g')
echo -e "  當前負載: $LOAD_AVG"

# 簡單判斷:如果負載超過 CPU 核心數的 1.5 倍,則警告
CORE_COUNT=$(nproc)
THRESHOLD=$(echo "$CORE_COUNT * 1.5" | bc)
if (( $(echo "$LOAD_AVG > $THRESHOLD" | bc -l) )); then
    echo -e "  狀態: ${RED}[警告] CPU 負載過高${NC}"
else
    echo -e "  狀態: ${GREEN}[正常]${NC}"
fi
echo ""

# 3. 記憶體使用檢查
echo -e "${GREEN}[記憶體使用]${NC}"
TOTAL_MEM=$(free -m | awk '/^Mem:/{print $2}')
USED_MEM=$(free -m | awk '/^Mem:/{print $3}')
USED_PERCENT=$(echo "scale=2; $USED_MEM * 100 / $TOTAL_MEM" | bc)
echo -e "  總量: ${TOTAL_MEM} MB"
echo -e "  已用: ${USED_MEM} MB (${USED_PERCENT}%)"

if (( $(echo "$USED_PERCENT > 90" | bc -l) )); then
    echo -e "  狀態: ${RED}[警告] 記憶體使用率過高${NC}"
elif (( $(echo "$USED_PERCENT > 70" | bc -l) )); then
    echo -e "  狀態: ${YELLOW}[注意] 記憶體使用率偏高${NC}"
else
    echo -e "  狀態: ${GREEN}[正常]${NC}"
fi
echo ""

# 4. 磁碟空間檢查
echo -e "${GREEN}[磁碟空間]${NC}"
df -h | grep '/$' | awk '{print "  磁碟: " $1 ", 總量: " $2 ", 已用: " $3 ", 可用: " $4 ", 使用率: " $5}'

# 檢查根目錄使用率
DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 90 ]; then
    echo -e "  狀態: ${RED}[警告] 根目錄空間不足${NC}"
elif [ "$DISK_USAGE" -gt 70 ]; then
    echo -e "  狀態: ${YELLOW}[注意] 根目錄空間偏高${NC}"
else
    echo -e "  狀態: ${GREEN}[正常]${NC}"
fi
echo ""

# 5. 關鍵服務狀態檢查
echo -e "${GREEN}[關鍵服務狀態]${NC}"
SERVICES=("sshd" "nginx") # 可根據需求調整服務名稱

for SERVICE in "${SERVICES[@]}"; do
    if systemctl is-active --quiet "$SERVICE" 2>/dev/null; then
        echo -e "  $SERVICE: ${GREEN}[運行中]${NC}"
    else
        echo -e "  $SERVICE: ${RED}[未運行]${NC}"
    fi
done
echo ""

# 6. 網路連線檢查
echo -e "${GREEN}[網路連線]${NC}"
if ping -c 2 -W 2 8.8.8.8 >/dev/null 2>&1; then
    echo -e "  外部連線: ${GREEN}[正常]${NC}"
else
    echo -e "  外部連線: ${RED}[異常]${NC}"
fi

echo ""
echo "========================================"
echo "  檢查完成"
echo "========================================"

如何執行

首先,賦予腳本執行權限:

chmod +x server_health_check.sh

然後執行腳本:

sudo ./server_health_check.sh

您將看到類似以下的輸出結果,其中包含各個資源的狀態評估。

常見問題與解決方案

1. 腳本執行時出現 bc: command not found 錯誤 這是因為 Debian/Ubuntu 系統預設未安裝 bc(基本計算器)工具。您可以透過以下指令安裝:

sudo apt update && sudo apt install -y bc

若不想安裝額外套件,可以改用 awk 進行浮點數比較,但腳本會變得較複雜。建議在管理伺服器時預先安裝 bc

2. 如何自動化定期檢查? 您可以使用 cron 定時任務來自動執行。例如,每天凌晨 2 點執行一次並將結果寄信給管理員:

crontab -e

加入以下行:

0 2 * * * /path/to/your/server_health_check.sh >> /var/log/health_check.log 2>&1

若需發送 Email 通知,可在腳本末尾加入 mail 指令或使用 sendmail

小結

透過這個簡單的 Shell 腳本,我們不僅能快速掌握伺服器的 CPU、記憶體、磁碟與網路狀態,還能透過顏色標記快速識別異常。對於初學者而言,這是一個極佳的練習機會,可以進一步擴充腳本功能,例如加入日誌記錄、整合監控平台(如 Prometheus 或 Zabbix),或設定更複雜的告警機制。掌握自動化腳本,是迈向高效系統管理的重要一步。