2017-04-25 247 views
1

我必须在Nodejs上使用exec方法,因为我需要执行一些stdout重定向并同时运行多个命令。于是我运行子进程是这样​​的:我该如何杀死Windows上由exec运行的子进程?

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我在belower代码做杀死这些孩子。它在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和Windows上的命令wmic命令ps。所以它是跨平台的。但这对我来说不起作用。有一个更好的方法吗?

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

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

我恐怕我应该尝试手动获取所有进程列表wmic。这就是ps-tree正在尝试做的事情。

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

更新

好吧,我发现了一个丑陋的解决方法。我通过python代码os.getpid()将我的python进程PID保存到外部文件中。因为这是你有麻烦的一个

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

看起来很危险 - 进程ID被重用,所以你可以杀死偶然的进程,碰巧有一个父进程ID与你的shell相同。处理流程树最稳健的方法是使用作业对象。如果'节点。js'不支持,你可以编写一个C程序来代表你运行子命令。 –

+0

“工作对象”是什么意思?我想要做的是杀死shell进程及其子进程,我想杀死完整的树。之后,其他进程可以重用进程ID – ChesuCR

+0

您可以使用作业对象来跟踪进程树,也可以使用它来杀死所有进程。 [看到这里。](http://stackoverflow.com/search?q=JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)不幸的是,这并不简单。使用'ps-tree'的风险是shell进程的进程ID可能以前属于其他进程。你会杀死进程中的所有子进程以及进程树中的子进程。我想如果你能通过除了父PID以外的其他特征来识别它们,你可以相应地过滤结果。 –

回答

1

我回答的Windows:有了这个,我可以节点中访问到有问题的PID这样。

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

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

之后,你应该能够关闭所有这些过程用命令

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

我在Ruby脚本调用一个坏运行得Java应用程序,我没有控制研究过使用这种技术。

+0

这不能解决OP的特定问题吗?这只提供了用于使用wmic命令(其中'ps-tree'已经完成)的API –

+0

@AP,因为ps-tree没有像假设那样工作我回答他的问题有没有更好的方法来做到这一点? – peter

+1

你至少可以尝试将这个包装成节点特定的答案,通过显示你如何使用[***'spawnSync()'***](https://nodejs.org/api/child_process.html #child_process_child_process_spawnsync_command_args_options)或[***'execSync()***](https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options)。所以它作为答案是相关的。 –