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

14

我正在寻找一种通过进程ID(pid)来杀死Node.js进程的方法。我已经在谷歌、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)吗?文档指出它是一个全局对象,可以从任何地方访问。

最后,稍微偏离一下话题,有没有办法确保pid始终是唯一的?当然,我不想无意中杀死进程。


1
为什么不能直接 return newProc 然后调用 newProc.kill('SIGHUP')。另外,您可以使用更类似于Linux的 exec('kill -9 ' + newProc.pid, callback) 来生成进程。 - vanadium23
我需要将一些东西存储在MongoDB中以进行记录,所以我认为pid可能更合适。我应该只是将newProc存储在MongoDB中,然后稍后调用newProc.kill('SIGHUP');吗?如果这不起作用,我会尝试您的第二个建议。谢谢! - FullStack
3个回答

21

process.kill()可以完成该任务。正如您所编辑的那样,process是在每个Node模块中都可用的全局对象。

请注意,PID仅在它运行时才能唯一地标识您的子进程。在它退出之后,PID可能已被重新用于不同的进程。如果您想确保不会意外杀死其他进程,您需要某种检查方法,以确定该进程实际上是您生成的那个进程。(newProc.kill()本质上是process.kill(pid)的包装函数,因此存在相同的问题。)


在文档的示例中,它没有展示如何使用pid来杀死进程。我们需要使用生成的引用来发送 spawned.kill([signal])。我希望使用pid号码完成子进程,假设我确定它是一个子进程。有没有一种方法可以在不使用其他库的情况下完成这个操作? - Leonardo Rick
3
@LeonardoRick 请再次查看 process.kill() 的文档。它的签名是 process.kill(pid, [status]),因此如果您想通过 PID 来终止进程,这就是您需要的函数。 - Denis Washington

3
您可以使用“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);

这条命令可以通过指定进程ID(PID)来确保杀死你的子进程;-)


1
我爱爱爱爱爱爱你。 - user1760150

0

使用tree-kill模块并将id作为process.pid传递,可以杀死长时间运行且没有返回的进程。

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

exec("some long non-return job like server start", function (error, stdout, stderr) {
console.log("stdout: " + stdout);
console.log("stderr: " + stderr);
if (error) console.log('exec error: ' + error);
});       
kill(process.pid);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,