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 <janscheffler@chromium.org>
This commit is contained in:
Pasi Tuominen 2022-02-17 14:17:33 +02:00 committed by GitHub
parent 6970a97df0
commit 0eb9c78617
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

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