【问题标题】:Node.js get pid at portNode.js 在端口获取 pid
【发布时间】:2016-07-14 23:32:02
【问题描述】:

在 Node.js 中,我想终止在端口 1337 上运行的服务器。 process.kill(pid) 似乎是这样做的方法。但是我如何获取在 Node.js 中在端口 1337 上运行的服务器的 pid?

我看到了很多关于如何使用 pslsof 执行此操作的示例。有没有办法在不依赖 Node.js 中的 shell 命令的情况下解决这个问题?

以下是我将如何依靠lsof

Number(child_process.execSync('lsof -i :1337 -t'))

【问题讨论】:

  • 您是否将服务器进程作为另一个 nodejs 进程的子进程启动?
  • @Cuz 是的,在我的情况下,该过程现在已经退出。

标签: node.js process port pid kill


【解决方案1】:

为了回答我的问题,我可以使用 port-pid 包确定端口处的 pid:https://www.npmjs.com/package/port-pid

但是,为了解决我的问题,我转而采用了这样一种理念,即端口正在使用是有“充分理由”的,而是选择通过包装 require('child_process').spawn 来终止子进程的产生位置:

var childProcess = require('child_process');
var spawn = (function () {
  var children = [];
  process.on('exit', function () {
    children.forEach(function (child) {
      child.kill();
    });
  });
  return function () {
    var child = childProcess.spawn.apply(childProcess, arguments);
    children.push(child);
    return child;
  };
}());
spawn('node', ['server/server.js'])

【讨论】:

    【解决方案2】:

    如果您从另一个 nodejs 进程作为子进程启动服务器,则只需执行 child.pid 即可获取服务器进程的 pid。

    例子:

    var child = child_process.spawnSync(command[, args][, options]);
    console.log(child.pid);
    process.kill(child.pid);
    

    【讨论】:

    • 在我的例子中,最初产生 node 的进程已经退出。即,我没有代表我要杀死的服务器的 child 对象。
    • 我明白了,在这种情况下,我认为没有 shell 命令是不行的。您可以尝试使用 ps-node ,如第二个答案中的here 所述。但我建议你重构你的代码以避免这种情况,或者使用一些工具作为编程 pm2。
    猜你喜欢
    • 2011-09-17
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多