我的 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 }
但是,也许我看错了。该领域的最佳做法是什么?