echo "===TEST:cpu===" # 读取温度(sensors 不可用时输出空) read_temp() { sensors 2>/dev/null | grep -oP '\+?\d+(\.\d+)?(?=°C)' | head -1 } # 后台采样 CPU 使用率 + 温度 SAMPLE_LOG=/tmp/auto-check-cpu-sample.log : > "$SAMPLE_LOG" ( while true; do TS=$(date +%H:%M:%S) CPU=$(top -bn1 2>/dev/null | grep "Cpu(s)" | sed -n 's/.*,\s*\([0-9.]*\)%*\s*id.*/\1/p' | awk '{printf "%.1f", 100-$1}' 2>/dev/null) TEMP=$(read_temp) echo "${TS},${CPU},${TEMP}" >> "$SAMPLE_LOG" sleep "${AUTOCHECK_SAMPLE_INTERVAL:-2}" done ) & SAMPLE_PID=$! START_TIME=$(date +%s%N) set +e OUTPUT=$(stress-ng --cpu "${AUTOCHECK_THREADS:-4}" --cpu-method all --timeout "${AUTOCHECK_DURATION:-30}s" --temp-path /tmp --metrics-brief 2>&1) EXIT_CODE=$? set -e END_TIME=$(date +%s%N) kill $SAMPLE_PID 2>/dev/null || true wait $SAMPLE_PID 2>/dev/null || true DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 )) if [ "$EXIT_CODE" -eq 0 ]; then echo 'status:pass'; else echo 'status:fail'; fi echo "duration:${DURATION_MS}ms" # 跑分:各 stressor 的 bogo ops/s 之和 SCORE=$(echo "$OUTPUT" | awk ' /^stress-ng:/ && ($4=="cpu" || $4=="vm" || $4=="iomix" || $4=="memrate") { v=$(NF-1)+0; if (v>0) s+=v } END { printf "%.1f", s+0 }') echo "score:${SCORE}" # 关键指标 AVG_CPU=$(awk -F',' '$2!="" {s+=$2; n++} END{printf "%.1f", (n?s/n:0)}' "$SAMPLE_LOG") echo "metric:avg_cpu=${AVG_CPU}" MAX_TEMP=$(awk -F',' '$3!="" && $3+0>m {m=$3} END{printf "%.1f", m+0}' "$SAMPLE_LOG") HAS_TEMP=$(awk -F',' '$3!="" && $3+0>0{f=1} END{print f+0}' "$SAMPLE_LOG") if [ "$HAS_TEMP" = "1" ]; then echo "metric:max_temp=${MAX_TEMP}"; fi echo "output:${OUTPUT}" # 采样数据(首行表头) echo "===SAMPLES===" echo "time,cpu,temp" cat "$SAMPLE_LOG" echo "===END_SAMPLES===" echo ''