From 0ff2144044e84f3820f55e68788271465c53f6c6 Mon Sep 17 00:00:00 2001 From: Pasi Tuominen Date: Wed, 24 Feb 2021 16:27:56 +0200 Subject: [PATCH] fix: change kill to signal the whole process group to terminate immediately --- src/node/BrowserRunner.ts | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/node/BrowserRunner.ts b/src/node/BrowserRunner.ts index e7e11bb143a40..44f605da51628 100644 --- a/src/node/BrowserRunner.ts +++ b/src/node/BrowserRunner.ts @@ -152,9 +152,16 @@ export class BrowserRunner { // If the process failed to launch (for example if the browser executable path // is invalid), then the process does not get a pid assigned. A call to // `proc.kill` would error, as the `pid` to-be-killed can not be found. - if (this.proc && this.proc.pid && !this.proc.killed) { + if (this.proc && this.proc.pid && pidExists(this.proc.pid)) { try { - this.proc.kill('SIGKILL'); + if (process.platform === 'win32') { + childProcess.execSync(`taskkill /pid ${this.proc.pid} /T /F`); + } else { + // on linux the process group can be killed with the group id prefixed with + // a minus sign. The process group id is the group leader's pid. + const processGroupId = -this.proc.pid; + process.kill(processGroupId, 'SIGKILL'); + } } catch (error) { throw new Error( `${PROCESS_ERROR_EXPLANATION}\nError cause: ${error.stack}` @@ -255,3 +262,15 @@ function waitForWSEndpoint( } }); } + +function pidExists(pid: number): boolean { + try { + return process.kill(pid, 0); + } catch (error) { + if (error && error.code && error.code === 'ESRCH') { + return false; + } else { + throw error; + } + } +}