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; + } + } +}