#!/bin/bash
# /root/checkload.sh
# crontab: */2 * * * * root /root/checkload.sh >> /root/checkload.log 2>&1
# === 可調參數 ===
MAX_LOAD=5 # 觸發重啟的負載閾值 (單核建議 3-5,多核乘以核心數)
SERVICE_NAME="httpd" # 服務名稱:httpd / nginx / php-fpm
CHECK_INTERVAL=2 # 重啟後檢查間隔 (秒)
MAX_RETRY=3 # 最大重試次數
# === 核心邏輯 ===
CURRENT_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
DATE_STR=$(date '+%Y-%m-%d %H:%M:%S')
echo "$DATE_STR [INFO] Current load: $CURRENT_LOAD (threshold: $MAX_LOAD)" >> /root/checkload.log
# 使用 bc 比較浮點數
if (( $(echo "$CURRENT_LOAD > $MAX_LOAD" | bc -l) )); then
echo "$DATE_STR [ALERT] Load $CURRENT_LOAD > $MAX_LOAD, restarting $SERVICE_NAME..." >> /root/checkload.log
# 強制殺掉殘留進程
pkill -9 $SERVICE_NAME
sleep 5
# 嘗試啟動,最多重試 MAX_RETRY 次
for i in $(seq 1 $MAX_RETRY); do
systemctl start $SERVICE_NAME 2>/dev/null || service $SERVICE_NAME start
sleep $CHECK_INTERVAL
RUNNING=$(pgrep -c $SERVICE_NAME)
if [ "$RUNNING" -gt 0 ]; then
echo "$DATE_STR [OK] $SERVICE_NAME restarted successfully (pid count: $RUNNING)" >> /root/checkload.log
break
else
echo "$DATE_STR [WARN] Attempt $i/$MAX_RETRY failed, retrying..." >> /root/checkload.log
fi
done
# 所有重試失敗
if [ "$(pgrep -c $SERVICE_NAME)" -eq 0 ]; then
echo "$DATE_STR [CRITICAL] $SERVICE_NAME failed to start after $MAX_RETRY attempts!" >> /root/checkload.log
# 可在此加入告警通知:mail、webhook、钉钉、Telegram
fi
else
# 負載正常,但服務意外停止 → 守護進程功能
if [ "$(pgrep -c $SERVICE_NAME)" -eq 0 ]; then
echo "$DATE_STR [GUARD] Load normal but $SERVICE_NAME not running, starting..." >> /root/checkload.log
systemctl start $SERVICE_NAME 2>/dev/null || service $SERVICE_NAME start
sleep $CHECK_INTERVAL
echo "$DATE_STR [GUARD] $SERVICE_NAME started (pid count: $(pgrep -c $SERVICE_NAME))" >> /root/checkload.log
fi
fi
| 場景 | MAX_LOAD 建議值 | 說明 |
|---|---|---|
| 單核 VPS (1 vCPU) | 3.0 – 4.0 | 負載 1.0 = 滿載,預留緩衝 |
| 雙核 VPS (2 vCPU) | 5.0 – 6.0 | 負載 2.0 = 滿載 |
| 四核 VPS (4 vCPU) | 10.0 – 12.0 | 負載 4.0 = 滿載 |
| Nginx + PHP-FPM | 分別監控 nginx/master、php-fpm pool | 建議拆分兩個腳本,針對性重啟 |
「負載過高自動重啟 Web 服務」是**治標不治本**的應急手段,但對資源受限的 VPS 而言,往往是**成本最低、部署最快、見效最直接**的保命稻草。生產環境務必疊加:雲端防護 → 邊界限流 → 應用層快取/降級 → 主機端守護腳本 → 監控告警 → 自動擴容,構建完整彈性防禦體系。