0
我的node.js服务器获取了很多EMFILE,并最终因libuv无法创建kqueue()而异常终止。所以,我想看看它发生了什么。我写了附加的脚本,它会分叉服务器,等待它崩溃,然后运行'lsof -p'。调试node.js过程的最佳实践?
我从文档的理解是,当一个fork'd孩子退出时,它会一直存在,直到发生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 }
但是,也许我看着这个错误的方式。这方面的最佳做法是什么?
位于http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options的底部,它表示“子进程一旦完成就不会自动退出,您需要显式调用process.exit()。将来会被解除。“ – mrose17
我想知道这是怎么发生的,但为什么看到一个礼物马在嘴里( - ; – mrose17
让我们忽略这种方法。有没有人有一个指针,我怎么可以检查一个节点的过程中止(例如,由于libuv我上面描述的断言)? – mrose17