已关闭
[Medium][optix/multihost_infer] stop_vllm_process.sh 按命令行模式自匹配,清理调用链自杀、重试保障失效并误杀无关进程 #410
mjsz创建于 25 天前关闭于 16 天前
25 天前 添加了label:bug
kai1949
25 天前 评论:
25 天前 评论:
/label add triaged
👋 您好,欢迎向 MindStudio-Modeling 提交 Issue!
我们已收到您的反馈,感谢你对开源社区的支持。🎉
📅处理时效: 维护团队将在8小时内 查看并回复您的问题(工作日)。
🔍自助查询: 在等待期间,建议您先查阅以下资料,可能已有解决方案:
📖 MindStudio-Modeling官方文档
📝 贡献者指南
请确保 Issue 描述清晰,包含复现步骤和日志,这将帮助我们更快定位问题。谢谢!


25 天前 添加了label:triaged
19 天前 关联了里程碑:MindStudio 26.3.0
19 天前 关联了里程碑:MindStudio 26.2.0
18 天前 关联了pull request:【多机混布】health检查接口增强& 杀残留进程增强
16 天前 issue状态由 TODO 改变为 DONE
16 天前 关闭了 issue
16 天前 添加了label:resolved
Bug 验证报告:PR686 发现 1(stop_vllm_process.sh 自匹配自杀)
bugverify-pr686-f1-20260903-01$1参数——部署路径/tmp/vllm/本身即含 "vllm"。[Medium][optix/multihost_infer] stop_vllm_process.sh 按命令行模式自匹配,清理调用链自杀、重试保障失效并误杀无关进程Problem
vllm_worker_manager.py的cleanup_all_workers()以bash /tmp/vllm/stop_vllm_process.sh vllm在各 worker 上清理残留 vllm 进程。脚本用pgrep/pkill -i -f "${name}"按完整命令行匹配,而调用链自身命令行必然包含该模式($1实参 + 部署路径/tmp/vllm/)。首次pkill -9即命中脚本自身进程/会话 shell,脚本在 attempt 1 中途被 SIGKILL:5 次重试与 WARNING 兜底成为死代码;真正的 vllm 进程只是"恰好"在同一轮 pkill 中被顺带杀掉,从而掩盖了自毁。-f模式过宽还会误杀命令行中偶然含 "vllm" 的无关进程。Reproduction(命令 + 配置,等价于生产调用)
生产调用即 fabric
conn.run("bash /tmp/vllm/stop_vllm_process.sh vllm")(sshd 侧等价于bash -c 'bash /tmp/vllm/stop_vllm_process.sh vllm',命令行含模式)。复现在任意 Linux 上执行:# Step 0: 部署脚本(与生产同路径 /tmp/vllm/) mkdir -p /tmp/vllm && cp <repo>/contrib/optix/multihost_infer/multihost_inference_optimization/script_template/stop_vllm_process.sh /tmp/vllm/ # Step 1 (T2 触发组, 无受害者): 生产同形调用 bash -c 'bash /tmp/vllm/stop_vllm_process.sh vllm; echo INNER_SURVIVED=$?' # 预期(脚本设计): 最多 5 轮 kill 尝试后输出 WARNING,INNER_SURVIVED=0 # 实际: 仅输出 "killing residual process matching: vllm (attempt 1/5)" 后整个调用链被 SIGKILL, # INNER_SURVIVED 永不打印,子进程退出码 137 # Step 2 (T1 完整矩阵): 假 vllm 受害者 + 偶然含 vllm 的无辜进程 + 干净对照 setsid bash /tmp/vllm/fake_vllm_worker.sh & # cmdline 含 /tmp/vllm/... → 模拟真实 vllm setsid tail -F /tmp/vllm/decoy.log & # cmdline 偶然含 vllm → 误杀面 setsid sleep 3000 & # 干净对照 bash -c 'bash /tmp/vllm/stop_vllm_process.sh vllm; echo INNER_SURVIVED=$?' # Step 3 (T3b2 真对照组): pattern 仅经环境变量通道、任何 cmdline 均不含它 MODEL_EVAL_STATE_KILL_PROCESS_NAME=zzznomatchzzz bash /tmp/vllm/stop_vllm_process.sh # 实际: "no residual process matching: zzznomatchzzz",退出 0 —— 脚本设计行为正常, # 证明触发条件就是「pattern 出现在某进程(含自身)命令行中」 # Step 4 (T5): 环境变量通道 + pattern=vllm(wrapper cmdline 干净) MODEL_EVAL_STATE_KILL_PROCESS_NAME=vllm bash /tmp/vllm/stop_vllm_process.sh # 实际: 脚本进程自身被 SIGKILL("Killed bash /tmp/vllm/stop_vllm_process.sh"),退出 137 # —— 部署路径 /tmp/vllm/ 单独足以自匹配Test Results(WSL2 Ubuntu-24.04 实测)
$1=vllm,零受害者$1=vllm+ 受害者/误杀面/对照sleep 300子进程被孤儿化,佐证 SIGKILL)tail -F /tmp/vllm/decoy.log被误杀sleep 3000存活/tmp/vllm/即触发Expected
清理脚本完成至多 5 轮 kill-验证循环,仍存活时输出 WARNING;仅杀死目标 vllm 服务进程;调用方拿到可判读的退出码。
Actual
任何 pattern 为 "vllm" 的现实调用(
$1通道或环境变量通道皆然)中,脚本在 attempt 1 的pkill -9 -i -f vllm处杀死自身调用链(脚本进程、会话 shell;docker 模式下宿主机侧docker exec链同样命中),重试循环与 WARNING 成为死代码。真实 vllm 进程仅因同一轮 pkill 被顺带击中才"看起来能用";命令行偶然含 "vllm" 的无关进程被误杀。Root Cause
pgrep/pkill -i -f对完整命令行做子串/正则匹配,且只排除进程自身 PID、不排除祖先;而模式串必然出现在调用链自身的命令行中($1实参与部署路径/tmp/vllm/两处)。procps-ng 4.0.4实测确认该语义。Environment
contrib/optix/multihost_infer/.../script_template/stop_vllm_process.sh与vllm_worker_manager.py,经git diff e8fd687..HEAD验证自 PR686 合入(2026-08-25)后字节级未变cleanup_all_workers()经 fabric(direct SSH 或 docker exec)远端执行;本机 WSL 复现与 sshd 派生 shell 的命令行形状一致(bash -c 'bash <script> <pattern>')Impact
warn=True只记日志不中断主流程)tail -f /tmp/vllm/*.log、编辑相关文件产生的进程)被 SIGKILLwarn=True兜底,故定级 Medium(次要功能可靠性 + 误杀风险),与原记录一致事实 / 推断 / 待确认
pkill进程仅排除自身不排除祖先(procps-ng 行为,实测 T5 脚本进程被杀)。修复方向(供 Issue 讨论)
/proc/self/status的 PPid 链收集后-v过滤),最小改动;pgrep -x)或锚定服务进程特征(如vllm serve|VLLM::EngineCore);start_workers时记录的_remote_pids定点 kill;/tmp/ms_worker_scripts),消除路径自匹配(与 1/2 配合)。