2015-05-05 54 views
1

我正在寻找一种方法来使用它们的pid来杀死Node.js进程。我一直在Google,StackOverflow和Node.js文档中搜索几个小时。这似乎应该存在。我只能找到基于我的变量newProc如何做到这一点,但我不能做newProc.kill(),因为我想从功能范围外杀死子进程。另外,我需要在MongoDB中保存一些用于保存记录的内容,所以我认为pid会更合适。如何使用pid杀死Node.js子进程?

var pid = newJob(); 
kill(pid); //<--anything like this? 

var newJob = function() { 
    var exec = require('child_process').exec, 
    var newProc = exec("some long running job", function (error, stdout, stderr) { 
    console.log("stdout: " + stdout); 
    console.log("stderr: " + stderr); 
    if (error) console.log('exec error: ' + error); 
    }); 
    return newProc.pid; 
} 

编辑:我可以在子进程上使用process.kill(pid)吗? docs指出它是一个可以从任何地方访问的全局对象。

最后,作为一个小切线,有没有办法确保pid的永远是唯一的?当然,我不想无意中杀死一个进程。

+0

为什么你不能'返回newProc',然后调用'newProc.kill( 'SIGHUP');'。你也可以像'exec('kill -9'+ newProc.pid,callback)那样生成更多的linux;' – vanadium23

+0

我需要在MongoDB中存储一些用于保存记录的内容,所以我认为pid会更合适。我应该简单地将'newProc'存储在MongoDB中,然后在后面调用newProc.kill('SIGHUP');'如果这不起作用,我会尝试你的第二个建议。谢谢! – FullStack

回答

5

process.kill()完成这项工作。如您在编辑中所述,process是每个Node模块中可用的全局对象。

请注意,只有在PID运行时,PID才能唯一标识您的子进程。退出后,PID可能已被重新用于不同的进程。如果你想确保你不会意外杀死另一个进程,你需要一些方法来检查进程是否实际上是你所生成的进程。 (newProc.kill()基本上是围绕process.kill(pid)的包装,因此具有the same problem。)