From 0eb9c7861717ebba7012c03e76b7a46063e4e5dd Mon Sep 17 00:00:00 2001 From: Pasi Tuominen Date: Thu, 17 Feb 2022 14:17:33 +0200 Subject: [PATCH] fix: change kill to signal the whole process group to terminate (#6859) * fix: change kill to signal the whole process group to terminate immediately * chore: ignore taskkill errors Co-authored-by: Jan Scheffler --- 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 e4b4aaca9600e..19e0ed386dfd7 100644 --- a/src/node/BrowserRunner.ts +++ b/src/node/BrowserRunner.ts @@ -183,9 +183,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.exec(`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}` @@ -294,3 +301,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; + } + } +}