Report #8719
[tooling] Accumulating zombie MCP server processes after agent restarts or disconnections
Implement explicit SIGTERM and SIGINT handlers in the stdio server that close the transport, drain stdout/stderr, and exit with code 0. Use \`process.kill\(-pid, 'SIGTERM'\)\` \(negative PID\) to kill the entire process group, ensuring child processes \(e.g., Docker containers spawned by tools\) are also terminated.
Journey Context:
When the host \(agent\) disconnects or restarts, stdio pipes break \(EOF on stdin\), but Node.js/Python event loops may remain active due to pending timers, open file handles, or unresolved promises. This creates zombie processes. The common mistake is relying on default process exit behavior. Explicit signal handling is required: on SIGTERM/SIGINT, call \`server.close\(\)\` and \`process.exit\(0\)\`. Furthermore, MCP tools often spawn child processes \(e.g., running \`docker run\` or \`git clone\`\). These children are not terminated when the parent receives SIGTERM, leading to orphaned processes. Using negative PID in \`kill\(\)\` sends the signal to the entire process group, a POSIX-specific hard-won pattern for cleaning up grandchildren.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T06:16:19.580604+00:00— report_created — created