fix(lifecycle): use process group kill (-pid) in handleExit safety net

With detached:true children, the synchronous exit handler must kill
the entire process group, not just the direct PID.
This commit is contained in:
2026-03-04 00:48:38 +00:00
parent a623ac5fe4
commit 76225c6b9f
2 changed files with 11 additions and 4 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@push.rocks/smartexit", "name": "@push.rocks/smartexit",
"version": "2.0.1", "version": "2.0.2",
"private": false, "private": false,
"description": "A library for managing graceful shutdowns of Node.js processes by handling cleanup operations, including terminating child processes.", "description": "A library for managing graceful shutdowns of Node.js processes by handling cleanup operations, including terminating child processes.",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",

View File

@@ -187,18 +187,25 @@ export class ProcessLifecycle {
}); });
} }
/** Synchronous last-resort: SIGKILL any remaining tracked PIDs. */ /** Synchronous last-resort: SIGKILL any remaining tracked process groups. */
private handleExit(): void { private handleExit(): void {
const instances = ProcessLifecycle.getInstances(); const instances = ProcessLifecycle.getInstances();
let killed = 0; let killed = 0;
for (const instance of instances) { for (const instance of instances) {
for (const pid of instance.trackedPids) { for (const pid of instance.trackedPids) {
// Kill entire process group (negative PID) for detached children
try { try {
process.kill(pid, 'SIGKILL'); process.kill(-pid, 'SIGKILL');
killed++; killed++;
} catch { } catch {
// Process already dead // Process group may not exist, try single PID
try {
process.kill(pid, 'SIGKILL');
killed++;
} catch {
// Process already dead
}
} }
} }
} }