55 lines
2.2 KiB
Bash
Executable File
55 lines
2.2 KiB
Bash
Executable File
#!/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
|