- 新增 aio-mcp 项目框架 - 新增 .trae/skills/ OCR/SKU 设计工具 - 更新 auto-check 配置和 stress 包 - 删除 fnhelp 文档目录 - 更新 Docker 压力测试脚本
82 lines
2.8 KiB
Bash
82 lines
2.8 KiB
Bash
# fnstable.sh - fnscript 稳定性门禁(社区脚本 self_inspection.py,vendor 原样收录不改源码)
|
||
#
|
||
# 思路:先用社区脚本检测硬件真实稳定性(stress CPU 压测 + memtester 内存数据校验),
|
||
# 通过后自有压测工具再跑一遍出报告;不通过则 run.sh 跳过自有压测。
|
||
#
|
||
# 适配注意(不改源码的代价,已逐一规避):
|
||
# 1. self_inspection.py CLI 模式无论成败 exit code 均为 0,
|
||
# 只能按 stdout 关键词判定结果("未发现问题" = 通过)。
|
||
# 2. --memory 内含两处 y/n 交互确认(input()),非交互环境会 EOFError,
|
||
# 用 printf 'y\ny\n' 管道喂入(两处确认都覆盖)。
|
||
# 3. 脚本内部调 sudo memtester / stress,依赖已在镜像中预装(root 下 sudo 直接可用)。
|
||
# 4. memtester 测试可用内存的 97%,单遍耗时 30-120 分钟(由内存大小决定),
|
||
# 可用 AUTOCHECK_FN_MEMORY=0 关闭内存校验只做 CPU 门禁。
|
||
#
|
||
# 输出遵守 auto-check 结构化协议(===TEST:fnstable=== 块),
|
||
# 并设置 GATE_PASSED 供 run.sh 决定是否继续自有压测。
|
||
|
||
echo "===TEST:fnstable==="
|
||
|
||
FN_SCRIPT="/vendor/fnscript/self_inspection.py"
|
||
FN_DURATION="${AUTOCHECK_DURATION:-30}"
|
||
FN_MEMORY="${AUTOCHECK_FN_MEMORY:-1}"
|
||
|
||
FN_ALL_PASSED=1
|
||
|
||
START_TIME=$(date +%s%N)
|
||
|
||
# ---- 1. CPU 稳定性(fnscript: stress --cpu 4 --timeout N)----
|
||
set +e
|
||
FN_CPU_OUT=$(python3 "$FN_SCRIPT" --cpu "$FN_DURATION" 2>&1)
|
||
set -e
|
||
if printf '%s' "$FN_CPU_OUT" | grep -q "未发现问题"; then
|
||
FN_CPU_STATUS="pass"
|
||
else
|
||
FN_CPU_STATUS="fail"
|
||
FN_ALL_PASSED=0
|
||
fi
|
||
|
||
# ---- 2. 内存稳定性(fnscript: sudo memtester <可用内存97%> 1,数据校验)----
|
||
FN_MEM_STATUS="skip"
|
||
FN_MEM_NOTE="未启用(AUTOCHECK_FN_MEMORY=0)"
|
||
if [ "$FN_MEMORY" = "1" ]; then
|
||
FN_MEM_NOTE=""
|
||
set +e
|
||
FN_MEM_OUT=$(printf 'y\ny\n' | python3 "$FN_SCRIPT" --memory 2>&1)
|
||
set -e
|
||
if printf '%s' "$FN_MEM_OUT" | grep -q "未发现问题"; then
|
||
FN_MEM_STATUS="pass"
|
||
else
|
||
FN_MEM_STATUS="fail"
|
||
FN_ALL_PASSED=0
|
||
fi
|
||
fi
|
||
|
||
END_TIME=$(date +%s%N)
|
||
DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 ))
|
||
|
||
# ---- 3. 汇总结果(门禁语义:任一子项失败即整体失败)----
|
||
if [ "$FN_ALL_PASSED" -eq 1 ]; then
|
||
echo 'status:pass'
|
||
else
|
||
echo 'status:fail'
|
||
fi
|
||
echo "duration:${DURATION_MS}ms"
|
||
|
||
echo "output:[CPU] ${FN_CPU_STATUS} (stress ${FN_DURATION}s)"
|
||
printf '%s\n' "$FN_CPU_OUT" | while IFS= read -r line; do
|
||
[ -n "$line" ] && echo "output: $line"
|
||
done
|
||
if [ "$FN_MEM_STATUS" = "skip" ]; then
|
||
echo "output:[MEM] skip - ${FN_MEM_NOTE}"
|
||
else
|
||
echo "output:[MEM] ${FN_MEM_STATUS} (memtester 可用内存97% 单遍校验)"
|
||
printf '%s\n' "$FN_MEM_OUT" | while IFS= read -r line; do
|
||
[ -n "$line" ] && echo "output: $line"
|
||
done
|
||
fi
|
||
echo ''
|
||
|
||
# 供 run.sh 门禁判断(fnstable 失败 → 跳过自有压测)
|
||
GATE_PASSED=$FN_ALL_PASSED
|