1

私の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 }

しかし、多分私はこれを間違った方法で見ています。この分野でのベストプラクティスは何ですか?

4

1 に答える 1