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