diff --git a/src/client/common/process/rawProcessApis.ts b/src/client/common/process/rawProcessApis.ts index 1e1b742a031c..27cd88d42851 100644 --- a/src/client/common/process/rawProcessApis.ts +++ b/src/client/common/process/rawProcessApis.ts @@ -75,10 +75,21 @@ export function shellExec( resolve({ stderr: stderr && stderr.length > 0 ? stderr : undefined, stdout }); } }; + let procExited = false; const proc = exec(command, shellOptions, callback); // NOSONAR + proc.once('close', () => { + procExited = true; + }); + proc.once('exit', () => { + procExited = true; + }); + proc.once('error', () => { + procExited = true; + }); const disposable: IDisposable = { dispose: () => { - if (!proc.killed) { + // If process has not exited nor killed, force kill it. + if (!procExited && !proc.killed) { if (proc.pid) { killPid(proc.pid); } else { @@ -114,7 +125,8 @@ export function plainExec( const deferred = createDeferred>(); const disposable: IDisposable = { dispose: () => { - if (!proc.killed) { + // If process has not exited nor killed, force kill it. + if (!proc.killed && !deferred.completed) { if (proc.pid) { killPid(proc.pid); } else {