工程(闸机超时守卫修复): gate_run_timeout 双缺陷修——①标志文件mktemp建时即真致退出码恒124(判据[-f]恒真,正常完成/真失败/真超时三态不可分)②守卫子壳被杀留孤儿sleep攥输出管道至满档(golden重采集白等7分钟症状)——修法:标志文件改先赋路径+rm-f垫底+真超时才落(probe_gate run_suite同款),守卫改0.2秒步进轮询盯停止文件(SECONDS截止线,命令先完父流程放停止文件守卫自见自退,机制上无孤儿可留,不依赖pkill/pgrep——Git Bash实测两件均缺位在案); gate_kill_tree头注补Windows缺pgrep退化注记(只杀顶格,调用方段末kill_orphans兜底); 退出码合同恢复(正常=命令真实退出码,超时=124); 三类调用方回归核对(render_gate5处/probe_gate2处/golden刷新3处)无分支翻转
改完即测读数: A1捕获正常路径60s档跑4s活=4.7s返回exit=0(修前基线60.3s/124); A2真超时3s档跑30s活=3.4s返回exit=124残留0; A3失败码穿透exit=7(修前误报124); A4终端直跑4.6s exit=0; B渲染闸全量【全绿】(修后函数真实入口5次调用:冷导入+shot/fx/board/lmap四段,golden逐像素7图全过,批末残留0); --docs【验收通过】无新增红 收口: 待办清单「闸机超时守卫缺陷修复」条目整条删除(状态机出口=完成,凭据=本批读数); mac侧凭据挂账随下次Mac跑批(载体=关卡视口两Shot基线mac侧冻结条目那趟必跑的golden刷新420s档); 远端CI纯闸件批预计零触发,mac读数按「未验」口径呈报不充绿证
This commit is contained in:
1 parent
b83dc5fd55
commit
7fc7a8925a
2 files changed
+21
-17
No files matched your search
+21
-9
@@ -20,6 +20,8 @@ gate_game_path() {
|
||||
|
||||
# 杀整棵进程树(<pid>)——递归杀子进程后杀本进程。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"
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user