1

我的 node.js 服务器收到很多 EMFILE,最终由于 libuv 无法创建 kqueue() 而中止。所以,我想看看发生这种情况时它会打开什么。我编写了附加的脚本,它分叉服务器,等待它崩溃,然后运行'lsof -p'。

我对文档的理解是,当一个分叉的孩子退出时,它会一直存在,直到 process.exit() 发生。这很好,因为 lsof 将能够在僵尸被擦除之前询问它的描述符:

var child_process = require('child_process')

child_process.fork('./index').on('close', function(code, signal) {
  var pid = this.pid;

  if (!!code) console.log('1: exit ' + code); else console.log('1: signal ' + signal);

  console.log('running lsof -p ' + pid);
  child_process.exec('lsof -p ' + pid, function(err, d) {
    if (!!err) { console.log('error:'); console.log(err); }
    if (!!d) console.log('data: ' + d.toString());
  });
}).on('error', function(err) {
  console.log(err.message);
  process.exit(1);
});

然而,对 exec() lsof 的调用总是调用带有错误参数的回调(这是 lsof 包从不检查的):

1: signal SIGABRT
running lsof -p 85661
error: { [Error: Command failed: ] killed: false, code: 1, signal: null }

但是,也许我看错了。该领域的最佳做法是什么?

4

1 回答 1

1

我对文档的理解是,当一个分叉的孩子退出时

这是不正确的。您阅读了哪些文档,我们可以帮助更新以使其更清晰?

于 2013-07-30T03:47:48.717 回答