From a205c6d1906caf2f1a1a381d48c052f7c379fd39 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Aug 2014 18:10:34 -0700 Subject: [PATCH] Use wmic to kill child processes --- src/buffered-process.coffee | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index cf583f976..1c38e0965 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -117,8 +117,34 @@ class BufferedProcess onLines(buffered) if buffered.length > 0 onDone() + # Kill all child processes of the spawned cmd.exe process on Windows. + # + # This is required since killing the cmd.exe does not terminate child + # processes. + killAllChildProcessesOnWindows: -> + parentPid = @process.pid + cmd = 'wmic' + args = [ + 'process' + 'where' + "(ParentProcessId=#{parentPid})" + 'get' + 'processid' + ] + + wmicProcess = ChildProcess.spawn(cmd, args) + output = '' + wmicProcess.stdout.on 'data', (data) -> output += data + wmicProcess.stdout.on 'close', -> + pidsToKill = output.split('\n') + .filter (pid) -> /^\d+$/.test(pid) + .map (pid) -> parseInt(pid) + .filter (pid) -> not pid is parentPid + process.kill(pid) for pid in pidsToKill + # Public: Terminate the process. kill: -> @killed = true + @killAllChildProcessesOnWindows() if process.platform is 'win32' @process.kill() @process = null