#!/bin/bash # 资源守卫 - 执行前检查机器资源 THRESHOLD_MEM=80 THRESHOLD_LOAD=1.5 MIN_DISK_GB=5 MIN_MEM_AVAILABLE_GB=1 LOG_DIR="/var/log/openclaw" RESOURCE_LOG="${LOG_DIR}/resource-guard.log" check_resources() { local cpu_usage load_5min num_cores normalized_load mem_total mem_available mem_pct disk_free exit_code=0 load_5min=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $2}' | sed 's/,//') num_cores=$(nproc) normalized_load=$(echo "scale=2; $load_5min / $num_cores" | bc 2>/dev/null || echo "99") # 可靠提取Mem行 local mem_info mem_info=$(free -m | awk 'NR==2{print $2, $3, $4, $7}') mem_total=$(echo "$mem_info" | awk '{print $1}') mem_available=$(echo "$mem_info" | awk '{print $4}') mem_pct=$(( (mem_total - mem_available) * 100 / mem_total )) disk_free=$(df -BG / | tail -1 | awk '{print $4}' | tr -d 'G') echo "[资源] 负载:${load_5min}(归一化:${normalized_load}) 内存:${mem_pct}% 可用:${mem_available}MB 磁盘:${disk_free}GB" (( $(echo "$normalized_load > $THRESHOLD_LOAD" | bc -l 2>/dev/null) )) && echo "⚠️ 负载(${load_5min})>阈值(${THRESHOLD_LOAD}x$num_cores核)" && exit_code=1 [ "$mem_pct" -gt "$THRESHOLD_MEM" ] && echo "⚠️ 内存(${mem_pct}%)>${THRESHOLD_MEM}%" && exit_code=1 [ "$mem_available" -lt $((MIN_MEM_AVAILABLE_GB * 1024)) ] && echo "⚠️ 可用内存(${mem_available}MB)<${MIN_MEM_AVAILABLE_GB}GB" && exit_code=1 [ "$disk_free" -lt "$MIN_DISK_GB" ] && echo "⚠️ 磁盘(${disk_free}GB)<${MIN_DISK_GB}GB" && exit_code=1 [ "$exit_code" -eq 0 ] && echo "✅ 资源检查通过" || echo "❌ 资源不足" # 写入日志(无论通过与否) mkdir -p "$LOG_DIR" echo "[$(date '+%Y-%m-%d %H:%M:%S')] load=${load_5min}(norm=${normalized_load}) mem=${mem_pct}% avail=${mem_available}MB disk=${disk_free}GB -> $([ $exit_code -eq 0 ] && echo PASS || echo FAIL)" >> "$RESOURCE_LOG" return $exit_code } case "$1" in --check) check_resources ;; *) if check_resources; then eval "$*" else echo "跳过: $*" exit 1 fi ;; esac