2013-07-29 47 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