Node.js如何获取端口上的进程ID?

4
在Node.js中,我想停止运行在端口1337上的服务器。使用process.kill(pid)似乎是实现这一目标的方法。但是,在Node.js中如何获取在端口1337上运行的服务器的pid呢?
我看到很多使用pslsof来完成此操作的示例。在Node.js中是否有不依赖于shell命令的方法来完成此操作呢?
以下是我使用lsof来完成此操作的方法:
Number(child_process.execSync('lsof -i :1337 -t'))

你是否已经从另一个Node.js进程中启动了服务器进程作为子进程? - pietrovismara
@Cuz 是的,在我的情况下,该进程现在已退出。 - Jackson
2个回答

2
为了回答我的问题,我可以使用 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'])

0
如果您从另一个Node.js进程启动了服务器,您只需执行child.pid即可获取服务器进程的PID。
例如:
var child = child_process.spawnSync(command[, args][, options]);
console.log(child.pid);
process.kill(child.pid);

在我的情况下,最初生成 node 的进程已经退出。也就是说,我没有一个代表我想要终止的服务器的 child 对象。 - Jackson
我明白,在这种情况下,我认为您无法避免使用shell命令。您可以尝试使用ps-node,正如第二个答案在此处中所述。但我建议您稍微重构一下代码以避免这种情况,或者使用一些工具,如编程式的pm2。 - pietrovismara

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