From a629f35e67fe3d5a7bdedf7c3760f43fffc795fb Mon Sep 17 00:00:00 2001 From: Anthony Date: Fri, 4 Jun 2021 14:02:17 -0700 Subject: [PATCH] Forwarding signals correctly to child process --- src/index.ts | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/index.ts b/src/index.ts index ed1be9c..3f8c181 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,6 +16,7 @@ import { makeLog } from './log' const version = require('../package.json').version const tsNodeVersion = require('ts-node').VERSION const tsVersion = require('typescript').version +const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'] export const runDev = ( script: string, @@ -118,6 +119,7 @@ export const runDev = ( child = fork(cmd[0], cmd.slice(1), { cwd: process.cwd(), env: process.env, + detached: true, }) starting = false @@ -167,11 +169,15 @@ export const runDev = ( compiler.compile(message) }) - child.on('exit', function (code) { - log.debug('Child exited with code %s', code) - if (!child) return - if (!child.respawn) process.exit(code || 0) - child = undefined + child.on('close', (code: number, signal: string) => { + log.debug('Child closed with code %s', code) + if (signal) { + log.debug(`Exiting process with signal ${signal}`) + process.kill(process.pid, signal) + } else { + log.debug(`Exiting process with code ${code}`) + process.exit(code) + } }) if (cfg.respawn) { @@ -203,14 +209,14 @@ export const runDev = ( }) compiler.writeReadyFile() } - const killChild = () => { + const killChild = (signal: NodeJS.Signals) => { if (!child) return - log.debug('Sending SIGTERM kill to child pid', child.pid) + log.debug(`Sending ${signal} to child pid`, child.pid) if (opts['tree-kill']) { log.debug('Using tree-kill') kill(child.pid) } else { - child.kill('SIGTERM') + child.kill(signal) } } function stop(willTerminate?: boolean) { @@ -223,8 +229,8 @@ export const runDev = ( log.debug('Disconnecting from child') child.disconnect() if (!willTerminate) { - killChild() } + killChild('SIGTERM') } } @@ -261,11 +267,17 @@ export const runDev = ( } } - // Relay SIGTERM - process.on('SIGTERM', function () { - log.debug('Process got SIGTERM') - killChild() - process.exit(0) + signals.forEach((signal: NodeJS.Signals) => + process.on(signal, () => { + log.debug(`Process got ${signal}, killing child`) + killChild(signal) + }) + ) + + process.on('exit', () => { + if(child) { + child.kill() + } }) const compiler = makeCompiler(opts, {