如何使用pid杀死Node.js子进程?

时间:2015-05-05 12:12:04

标签: javascript node.js

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

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始终是唯一的?当然,我不想无意中杀死一个进程。

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:2)

您可以使用“tree-kill”模块。

var kill  = require('tree-kill');
var exec  = require('child_process').exec;

  var child = exec('program.exe',  {cwd: 'C:/test'}, (err, stdout, stderr) => {
        if (stdout) console.log('stdout: ' + stdout);
        if (stderr) console.log('stderr: ' + stderr);
        if (err !== null) {
          console.log('exec error: ' + err)};
    });
  child.stdout.on('data', function(log_data) {
      console.log(log_data)
  });

kill(child.pid);

这肯定会通过它的PID杀死你的子进程;-)