From 7fc7a8925a4605d2eb53bff41f31b2ca52a01b1f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 8 Nov 2026 01:05:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E9=97=B8=E6=9C=BA=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E5=AE=88=E5=8D=AB=E4=BF=AE=E5=A4=8D):=20gate=5Frun=5F?= =?UTF-8?q?timeout=20=E5=8F=8C=E7=BC=BA=E9=99=B7=E4=BF=AE=E2=80=94?= =?UTF-8?q?=E2=80=94=E2=91=A0=E6=A0=87=E5=BF=97=E6=96=87=E4=BB=B6mktemp?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=E5=8D=B3=E7=9C=9F=E8=87=B4=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=A0=81=E6=81=92124(=E5=88=A4=E6=8D=AE[-f]=E6=81=92=E7=9C=9F,?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E5=AE=8C=E6=88=90/=E7=9C=9F=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5/=E7=9C=9F=E8=B6=85=E6=97=B6=E4=B8=89=E6=80=81?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E5=88=86)=E2=91=A1=E5=AE=88=E5=8D=AB?= =?UTF-8?q?=E5=AD=90=E5=A3=B3=E8=A2=AB=E6=9D=80=E7=95=99=E5=AD=A4=E5=84=BF?= =?UTF-8?q?sleep=E6=94=A5=E8=BE=93=E5=87=BA=E7=AE=A1=E9=81=93=E8=87=B3?= =?UTF-8?q?=E6=BB=A1=E6=A1=A3(golden=E9=87=8D=E9=87=87=E9=9B=86=E7=99=BD?= =?UTF-8?q?=E7=AD=897=E5=88=86=E9=92=9F=E7=97=87=E7=8A=B6)=E2=80=94?= =?UTF-8?q?=E2=80=94=E4=BF=AE=E6=B3=95:=E6=A0=87=E5=BF=97=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=94=B9=E5=85=88=E8=B5=8B=E8=B7=AF=E5=BE=84+rm-f?= =?UTF-8?q?=E5=9E=AB=E5=BA=95+=E7=9C=9F=E8=B6=85=E6=97=B6=E6=89=8D?= =?UTF-8?q?=E8=90=BD(probe=5Fgate=20run=5Fsuite=E5=90=8C=E6=AC=BE),?= =?UTF-8?q?=E5=AE=88=E5=8D=AB=E6=94=B90.2=E7=A7=92=E6=AD=A5=E8=BF=9B?= =?UTF-8?q?=E8=BD=AE=E8=AF=A2=E7=9B=AF=E5=81=9C=E6=AD=A2=E6=96=87=E4=BB=B6?= =?UTF-8?q?(SECONDS=E6=88=AA=E6=AD=A2=E7=BA=BF,=E5=91=BD=E4=BB=A4=E5=85=88?= =?UTF-8?q?=E5=AE=8C=E7=88=B6=E6=B5=81=E7=A8=8B=E6=94=BE=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=AE=88=E5=8D=AB=E8=87=AA=E8=A7=81=E8=87=AA?= =?UTF-8?q?=E9=80=80,=E6=9C=BA=E5=88=B6=E4=B8=8A=E6=97=A0=E5=AD=A4?= =?UTF-8?q?=E5=84=BF=E5=8F=AF=E7=95=99,=E4=B8=8D=E4=BE=9D=E8=B5=96pkill/pg?= =?UTF-8?q?rep=E2=80=94=E2=80=94Git=20Bash=E5=AE=9E=E6=B5=8B=E4=B8=A4?= =?UTF-8?q?=E4=BB=B6=E5=9D=87=E7=BC=BA=E4=BD=8D=E5=9C=A8=E6=A1=88);=20gate?= =?UTF-8?q?=5Fkill=5Ftree=E5=A4=B4=E6=B3=A8=E8=A1=A5Windows=E7=BC=BApgrep?= =?UTF-8?q?=E9=80=80=E5=8C=96=E6=B3=A8=E8=AE=B0(=E5=8F=AA=E6=9D=80?= =?UTF-8?q?=E9=A1=B6=E6=A0=BC,=E8=B0=83=E7=94=A8=E6=96=B9=E6=AE=B5?= =?UTF-8?q?=E6=9C=ABkill=5Forphans=E5=85=9C=E5=BA=95);=20=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=A0=81=E5=90=88=E5=90=8C=E6=81=A2=E5=A4=8D(?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=3D=E5=91=BD=E4=BB=A4=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E9=80=80=E5=87=BA=E7=A0=81,=E8=B6=85=E6=97=B6=3D124);=20?= =?UTF-8?q?=E4=B8=89=E7=B1=BB=E8=B0=83=E7=94=A8=E6=96=B9=E5=9B=9E=E5=BD=92?= =?UTF-8?q?=E6=A0=B8=E5=AF=B9(render=5Fgate5=E5=A4=84/probe=5Fgate2?= =?UTF-8?q?=E5=A4=84/golden=E5=88=B7=E6=96=B03=E5=A4=84)=E6=97=A0=E5=88=86?= =?UTF-8?q?=E6=94=AF=E7=BF=BB=E8=BD=AC=20=E6=94=B9=E5=AE=8C=E5=8D=B3?= =?UTF-8?q?=E6=B5=8B=E8=AF=BB=E6=95=B0:=20A1=E6=8D=95=E8=8E=B7=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E8=B7=AF=E5=BE=8460s=E6=A1=A3=E8=B7=914s=E6=B4=BB=3D4?= =?UTF-8?q?.7s=E8=BF=94=E5=9B=9Eexit=3D0(=E4=BF=AE=E5=89=8D=E5=9F=BA?= =?UTF-8?q?=E7=BA=BF60.3s/124);=20A2=E7=9C=9F=E8=B6=85=E6=97=B63s=E6=A1=A3?= =?UTF-8?q?=E8=B7=9130s=E6=B4=BB=3D3.4s=E8=BF=94=E5=9B=9Eexit=3D124?= =?UTF-8?q?=E6=AE=8B=E7=95=990;=20A3=E5=A4=B1=E8=B4=A5=E7=A0=81=E7=A9=BF?= =?UTF-8?q?=E9=80=8Fexit=3D7(=E4=BF=AE=E5=89=8D=E8=AF=AF=E6=8A=A5124);=20A?= =?UTF-8?q?4=E7=BB=88=E7=AB=AF=E7=9B=B4=E8=B7=914.6s=20exit=3D0;=20B?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E9=97=B8=E5=85=A8=E9=87=8F=E3=80=90=E5=85=A8?= =?UTF-8?q?=E7=BB=BF=E3=80=91(=E4=BF=AE=E5=90=8E=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E5=85=A5=E5=8F=A35=E6=AC=A1=E8=B0=83?= =?UTF-8?q?=E7=94=A8:=E5=86=B7=E5=AF=BC=E5=85=A5+shot/fx/board/lmap?= =?UTF-8?q?=E5=9B=9B=E6=AE=B5,golden=E9=80=90=E5=83=8F=E7=B4=A07=E5=9B=BE?= =?UTF-8?q?=E5=85=A8=E8=BF=87,=E6=89=B9=E6=9C=AB=E6=AE=8B=E7=95=990);=20--?= =?UTF-8?q?docs=E3=80=90=E9=AA=8C=E6=94=B6=E9=80=9A=E8=BF=87=E3=80=91?= =?UTF-8?q?=E6=97=A0=E6=96=B0=E5=A2=9E=E7=BA=A2=20=E6=94=B6=E5=8F=A3:=20?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95=E3=80=8C=E9=97=B8=E6=9C=BA?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E5=AE=88=E5=8D=AB=E7=BC=BA=E9=99=B7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E3=80=8D=E6=9D=A1=E7=9B=AE=E6=95=B4=E6=9D=A1=E5=88=A0?= =?UTF-8?q?=E9=99=A4(=E7=8A=B6=E6=80=81=E6=9C=BA=E5=87=BA=E5=8F=A3=3D?= =?UTF-8?q?=E5=AE=8C=E6=88=90,=E5=87=AD=E6=8D=AE=3D=E6=9C=AC=E6=89=B9?= =?UTF-8?q?=E8=AF=BB=E6=95=B0);=20mac=E4=BE=A7=E5=87=AD=E6=8D=AE=E6=8C=82?= =?UTF-8?q?=E8=B4=A6=E9=9A=8F=E4=B8=8B=E6=AC=A1Mac=E8=B7=91=E6=89=B9(?= =?UTF-8?q?=E8=BD=BD=E4=BD=93=3D=E5=85=B3=E5=8D=A1=E8=A7=86=E5=8F=A3?= =?UTF-8?q?=E4=B8=A4Shot=E5=9F=BA=E7=BA=BFmac=E4=BE=A7=E5=86=BB=E7=BB=93?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E9=82=A3=E8=B6=9F=E5=BF=85=E8=B7=91=E7=9A=84?= =?UTF-8?q?golden=E5=88=B7=E6=96=B0420s=E6=A1=A3);=20=E8=BF=9C=E7=AB=AFCI?= =?UTF-8?q?=E7=BA=AF=E9=97=B8=E4=BB=B6=E6=89=B9=E9=A2=84=E8=AE=A1=E9=9B=B6?= =?UTF-8?q?=E8=A7=A6=E5=8F=91,mac=E8=AF=BB=E6=95=B0=E6=8C=89=E3=80=8C?= =?UTF-8?q?=E6=9C=AA=E9=AA=8C=E3=80=8D=E5=8F=A3=E5=BE=84=E5=91=88=E6=8A=A5?= =?UTF-8?q?=E4=B8=8D=E5=85=85=E7=BB=BF=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/gate_platform.sh | 30 +++++++++++++++++++++--------- 待办清单.md | 8 -------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/tools/gate_platform.sh b/tools/gate_platform.sh index 8847cae3..15ae5f70 100644 --- a/tools/gate_platform.sh +++ b/tools/gate_platform.sh @@ -20,6 +20,8 @@ gate_game_path() { # 杀整棵进程树()——递归杀子进程后杀本进程。macOS/Linux 走 pgrep -P; # Windows 侧 MSYS kill 对其可见进程有效,带 wrapper 树的场景仍由调用方原 taskkill /T 逻辑负责。 +# 注意:Windows Git Bash 实测无 pgrep/pkill(2026-11-08 修复批)——本函数在 Windows 退化成只杀 +# 顶格进程,引擎子进程残留由调用方段末 kill_orphans 清场兜底(probe_gate/render_gate 均有段后清点)。 gate_kill_tree() { local p c kill -9 "$1" 2>/dev/null @@ -29,26 +31,36 @@ gate_kill_tree() { # 带超时执行(coreutils timeout 的纯 bash 替代,双平台同语义): # gate_run_timeout <秒> <日志路径> <命令...> # 命令输出重定向到日志;退出码=命令退出码,超时=124(与 coreutils 语义一致,判据与既有闸一致)。 -# 实现=后台启动+守卫落标志文件(probe_gate run_suite 同款手法:taskkill 强杀后 wait 报 0 的 -# 假绿以标志文件纠偏);超时先杀整树再回 124。 +# 实现=后台启动+守卫轮询(守卫每 0.2 秒醒一次,看两样:停止文件在不在/到点没; +# 命令先完时父流程放停止文件,守卫看见即自己退场——没有嵌套长 sleep,从机制上无孤儿可留; +# 2026-11-08 修复批:旧版 mktemp 建标志文件「建时即真」致退出码恒 124+守卫被杀留孤儿 sleep +# 占输出管道至满档);到点未见停止文件=真超时:落标志文件+杀整树+回 124。 gate_run_timeout() { local t="$1" log="$2"; shift 2 - local kf - kf="$(mktemp "${TMPDIR:-/tmp}/gatetime_XXXXXX")" + local kf stop + kf="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.kf" # 只赋路径、不建文件——建时即真=旧缺陷病根(probe_gate run_suite 同款) + stop="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.stop" + rm -f "$kf" "$stop" "$@" >"$log" 2>&1 & local pid=$! - ( sleep "$t" 2>/dev/null - touch "$kf" - gate_kill_tree "$pid" + ( end=$((SECONDS+t)) + until [ -f "$stop" ] || [ "$SECONDS" -ge "$end" ]; do + sleep 0.2 2>/dev/null || sleep 1 + done + if [ ! -f "$stop" ]; then + touch "$kf" + gate_kill_tree "$pid" + fi true ) & local guard=$! wait "$pid"; local st=$? - kill "$guard" 2>/dev/null; wait "$guard" 2>/dev/null + touch "$stop" # 放停止文件=通知守卫收工,0.2 秒内自退,无需 kill + wait "$guard" 2>/dev/null if [ -f "$kf" ]; then gate_kill_tree "$pid" st=124 fi - rm -f "$kf" + rm -f "$kf" "$stop" return "$st" } diff --git a/待办清单.md b/待办清单.md index bccdc129..8f363bba 100644 --- a/待办清单.md +++ b/待办清单.md @@ -391,14 +391,6 @@ **状态**:待执行 -#### 闸机超时守卫缺陷修复——gate_run_timeout 标志文件恒真(2026-11-06 登记,来源=批次移交) - -**实况**:tools/gate_platform.sh 的 gate_run_timeout 用 mktemp 预建超时标志文件,判据 `[ -f ]` 建时即真、超时态无法与正常完成区分(Windows Git Bash 实测直接调用 4 秒返回 124;远端各闸以工件锚定未受影响)。连带 tools/golden_baseline_refresh.sh 的 guard 子Shell sleep 420 未被 kill 短路(重采集等待 7 分钟症状)。修法=kf 先赋路径+rm -f 后置守卫(probe_gate.sh:97 run_suite 同款正确写法)。证据=tools/gate_platform.sh:37/:48+迭代53实现报告遗留呈报 1(git 历史可考)。 - -**改动面**:工具代码 - -**状态**:待执行 - #### 关卡视口两 Shot 基线 mac 侧冻结(2026-11-06 登记,来源=批次移交) **实况**:golden/windows/ 已锚 lmap_entry/lmap_boss(提交 6394abf7);mac 子目录无该两 Shot——渲染闸对 mac 缺基线记 SKIP 不判红,两平台同盯缺一。义务=Mac 侧跑 tools/golden_baseline_refresh.sh --lmap 冻结 mac 基线并呈报确定性读数。证据=game/tests/golden/README.md 现持清单行与时效判定纪律行+迭代53实现报告遗留 2(git 历史可考)。