如何杀死Windows上的exec运行的子进程?

时间:2017-04-25 16:55:15

标签: node.js windows electron child-process kill-process

我必须在Nodejs上使用方法exec因为我需要做一些stdout重定向并同时运行多个命令。所以我像这样运行子进程:

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上获得一个孤儿(僵尸)进程。

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源代码进行探索,但我一无所获。

我使用process.kill,因为我也在使用electron

我恐怕应该尝试手动获取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();                
});

1 个答案:

答案 0 :(得分:2)

我为Windows回答,因为那是你遇到麻烦的那个。

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

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

之后,您应该能够使用命令

关闭所有这些进程
wmic process Where "CommandLine Like '%my_select_criterium%'" Call Terminate

我在Ruby脚本中使用这种技术,该脚本调用了一个我无法控制的糟糕行为java应用程序。

相关问题