2013-07-29 48 views
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 } 

但是,也许我看着这个错误的方式。这方面的最佳做法是什么?

回答

1

我从文档的理解是,当一个孩子fork'd退出

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

+0

位于http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options的底部,它表示“子进程一旦完成就不会自动退出,您需要显式调用process.exit()。将来会被解除。“ – mrose17

+0

我想知道这是怎么发生的,但为什么看到一个礼物马在嘴里( - ; – mrose17

+0

让我们忽略这种方法。有没有人有一个指针,我怎么可以检查一个节点的过程中止(例如,由于libuv我上面描述的断言)? – mrose17