Gemini CLI 修复子进程信号转发,避免重启后孤儿进程
C0d3N1nja97342 · ghdev · 2026-08-04
这次修复了什么
gemini-cli 现在会把父进程接收到的终止信号转发给重启后的子进程,因此像 kill -TERM <pid> 这样的受管退出,会真正停掉仍在运行的 child,而不是把它挂成孤儿进程。
问题出在哪里
修复前,bootstrap 父进程收到 SIGTERM / SIGHUP 之类信号后会按默认行为退出,但子进程会继续跑,OAuth 会话和已分配内存也会被一直占着,直到手动杀掉。这个问题主要出现在 ACP client、systemd、容器运行时等“程序化退出”场景;键盘 Ctrl+C 因为会作用到整个前台进程组,所以不容易复现。
实现方式
- 在 spawn 后为 SIGTERM、SIGHUP、SIGINT、SIGQUIT、SIGUSR1、SIGUSR2 注册转发器
- 在 close 和 error 时移除监听,避免 relaunch 迭代累积 listener
- 对 child.kill(sig) 做了 try/catch,处理“信号刚到但子进程已退出”的竞态
- stdio: inherit 和 detached 保持不变
验证
新增回归测试覆盖了:
- 父进程确实多注册了一个 SIGTERM 监听;
- 触发该监听会调用 child.kill('SIGTERM');
- close 后监听会被移除,避免泄漏。
「编程与Agent」频道最新
- 多智能体系统可能把笔记本内存和 CPU 吃满 — zephyr_z9 · 2026-08-04
- Grok 现已支持直接观看视频链接并回答问题 — Kyrannio · 2026-08-04
- Doota Mail 自托管改成 fork、加密钥再跑 CI — samgoodwin89 · 2026-08-04
- Codex 通过 MCP 把图片和视频生成外包给 GlobalGPT — SarahAnnabels · 2026-08-04
- Codex 把多模态生成交给 GlobalGPT 再回填工作区 — SarahAnnabels · 2026-08-04
- GlobalGPT 推出终端 CLI,可直接做聊天和多模态生成 — SarahAnnabels · 2026-08-04