| import { spawn } from "node:child_process"; | |
| /** | |
| * Best-effort process-tree termination. | |
| * - Windows: use taskkill /T to include descendants. | |
| * - Unix: try process-group kill first, then direct pid kill. | |
| */ | |
| export function killProcessTree(pid: number): void { | |
| if (!Number.isFinite(pid) || pid <= 0) { | |
| return; | |
| } | |
| if (process.platform === "win32") { | |
| try { | |
| spawn("taskkill", ["/F", "/T", "/PID", String(pid)], { | |
| stdio: "ignore", | |
| detached: true, | |
| }); | |
| } catch { | |
| // ignore taskkill failures | |
| } | |
| return; | |
| } | |
| try { | |
| process.kill(-pid, "SIGKILL"); | |
| } catch { | |
| try { | |
| process.kill(pid, "SIGKILL"); | |
| } catch { | |
| // process already gone or inaccessible | |
| } | |
| } | |
| } | |