私の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 }
しかし、多分私はこれを間違った方法で見ています。この分野でのベストプラクティスは何ですか?