From 73b0b60bdd046a4cff8662b5f9217270641dfc49 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Sat, 18 Apr 2026 21:46:15 +0700 Subject: [PATCH] fix(server): block dev-runner on Ctrl-C until supervisor finishes shutting down The spawnSync parent had no signal handlers, so SIGINT killed it immediately while the supervisor kept running in the background. The shell prompt came back before the daemon had actually drained. Install no-op SIGINT/SIGTERM handlers so spawnSync waits for the supervisor's graceful exit. --- packages/server/scripts/dev-runner.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/server/scripts/dev-runner.ts b/packages/server/scripts/dev-runner.ts index c8d0d87e6..0d6bac116 100644 --- a/packages/server/scripts/dev-runner.ts +++ b/packages/server/scripts/dev-runner.ts @@ -8,6 +8,14 @@ dotenv.config({ }); const daemonRunnerEntry = fileURLToPath(new URL("./supervisor-entrypoint.ts", import.meta.url)); + +// The supervisor handles SIGINT/SIGTERM itself and needs time to drain the +// worker gracefully. Ignore them here so spawnSync blocks until the supervisor +// finishes shutting down, instead of the parent dying on Ctrl-C and releasing +// the shell while the daemon is still logging. +process.on("SIGINT", () => {}); +process.on("SIGTERM", () => {}); + const result = spawnSync( process.execPath, [