Skip to content

Commit

Permalink
fix: change kill to signal the whole process group to terminate (#6859)
Browse files Browse the repository at this point in the history
* fix: change kill to signal the whole process group to terminate immediately

* chore: ignore taskkill errors

Co-authored-by: Jan Scheffler <janscheffler@chromium.org>
  • Loading branch information
petuomin and jschfflr authored Feb 17, 2022
1 parent 6970a97 commit 0eb9c78
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions src/node/BrowserRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}`
Expand Down Expand Up @@ -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;
}
}
}

0 comments on commit 0eb9c78

Please sign in to comment.