# 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