What is the problem this feature will solve?
subprocess.kill([signal]) only targets the direct child PID. Descendants often keep running, especially when:
shell: true (shell exits, real command survives)
- the child is a build driver (
bash / make / ninja) that spawns grandchildren
- on Windows, where POSIX signals are not real and
kill() does not terminate a process tree
Userland workarounds are fragmented and OS-specific:
- Unix:
detached: true + process.kill(-pid, signal) (process group; not always applicable)
- Windows:
taskkill /pid <pid> /T /F (or equivalent)
- npm packages such as
tree-kill
This comes up often for Ctrl+C / timeout cleanup in CLIs and build orchestrators.
Related prior request (closed stale): #40438 (killDeep).
What is the feature you are proposing to solve the problem?
Add an explicit, documented API, for example:
subprocess.killTree([signal]);
// and/or
child_process.killTree(pid[, signal]);
Goals:
- Cross-platform: one call that best-effort terminates the process and its descendants on Windows, Linux, and macOS.
- Clear semantics vs
kill(): kill() stays single-PID; killTree() is the tree variant.
- Document limitations: PID reuse races, process-group vs true tree walk, signal mapping on Windows (where signals are not POSIX).
A reasonable Windows implementation can use the platform tree-terminate facility (today: taskkill /T); Unix can use process-group kill when the child is a group leader, otherwise a documented tree walk.
What alternatives have you considered?
- Keep using
tree-kill / ad-hoc taskkill in every project
- Rely on
detached + negative PID (Unix-only, requires spawn options up front)
- Expand
subprocess.kill() to kill trees (breaking / surprising; prefer a separate killTree name)
Naming killTree (rather than overloading kill) makes the stronger, OS-dependent behavior opt-in and discoverable.
What is the problem this feature will solve?
subprocess.kill([signal])only targets the direct child PID. Descendants often keep running, especially when:shell: true(shell exits, real command survives)bash/make/ninja) that spawns grandchildrenkill()does not terminate a process treeUserland workarounds are fragmented and OS-specific:
detached: true+process.kill(-pid, signal)(process group; not always applicable)taskkill /pid <pid> /T /F(or equivalent)tree-killThis comes up often for Ctrl+C / timeout cleanup in CLIs and build orchestrators.
Related prior request (closed stale): #40438 (
killDeep).What is the feature you are proposing to solve the problem?
Add an explicit, documented API, for example:
Goals:
kill():kill()stays single-PID;killTree()is the tree variant.A reasonable Windows implementation can use the platform tree-terminate facility (today:
taskkill /T); Unix can use process-group kill when the child is a group leader, otherwise a documented tree walk.What alternatives have you considered?
tree-kill/ ad-hoctaskkillin every projectdetached+ negative PID (Unix-only, requires spawn options up front)subprocess.kill()to kill trees (breaking / surprising; prefer a separatekillTreename)Naming
killTree(rather than overloadingkill) makes the stronger, OS-dependent behavior opt-in and discoverable.