我怎样才能杀死在Windows上由exec运行的subprocess?

我必须在Nodejs上使用exec方法,因为我需要执行一些stdoutredirect,并同时运行多个命令。 所以我运行这样的subprocess

 let shell = null; const child_process = require('child_process') var command = 'activate python_environment & bokeh serve project_folder/ log/logger.log 2>&1'; shell = child_process.exec(command); 

我需要ps-tree来杀死孩子,就像我在下面的代码中一样。 它在Ubuntu上运行良好。 但问题是我得到一个孤儿(僵尸)进程在Windows上,如果我不杀死subprocess。

 const psTree = require('ps-tree') app.on('window-all-closed', function () { electron.app.quit() if(shell != null){ psTree(shell.pid, function (err, children) { children.map(function (p) { process.kill(p.PID); }); }); } }); 

ps-tree模块在Linux上使用命令ps ,在Windows上使用命令wmic 。 所以这是跨平台的。 但在我的情况下不起作用。 有一个更好的方法吗?

我正在探索ps-tree源代码,但是我什么也没find。

我使用process.kill因为我也使用电子 。

我恐怕我应该尝试手动使用wmic获取所有进程列表。 这就是ps-tree想要做的。

注意:模块tree-kill在两个平台上都不起作用。

更新

那么,我发现了一个丑陋的解决方法。 我通过python代码os.getpid()将我的python进程PID保存到外部文件中。 有了这个,我可以像这样访问节点内有问题的PID:

 const fs = require('fs'); fs.readFile(filePath, 'utf-8', function (err, data) { process.kill(parseInt(data, 10)); app.quit(); }); 

我回答了Windows,因为那是你遇到的问题。

看着你执行的命令,在我看来,你的两个命令的连接可能是罪魁祸首,所以我会尝试没有它。

如果你不能使用wmic是我所知道的最好的方法,那么你第一次必须手动检查yes。 一旦你有选择标准,你可以自动关闭一切。 当进程忙时,运行命令wmic process>processes.txt 。然后使用编辑器检查文件processes.txt,并在列commandline中查找所有要杀死的进程的公共字符串。 这将是你的选择标准。 由于创建过程的整个命令行都有路径和参数,所以这应该不成问题。

之后,您应该能够使用该命令关闭所有这些进程

 wmic process Where "CommandLine Like '%my_select_criterium%'" Call Terminate 

我在一个Ruby脚本中使用这种技术,这个脚本调用了一个行为不良的Java应用程序,我无法控制它。