2

ノードを少しいじっていて、child_process モジュールを学習しようとしているときに、問題が発生しました。「ps -eF |」への多くの呼び出しをシリアル化しようとしていました。grep ssh' を実行しましたが、私のシステムでは以下のエラーでクラッシュします。そこで2つ質問です。まず、ライブラリなしで私が試みていることを行うためのより良い方法はありますか? 第二に、なぜそれが機能しないのですか:)

events.js:71
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: This socket is closed.
    at Socket._write (net.js:519:19)
    at Socket.write (net.js:511:15)
    at Socket.<anonymous> (/home/me/tmp/test.js:10:16)
    at Socket.EventEmitter.emit (events.js:96:17)
    at Pipe.onread (net.js:397:14)
function callpsgrep(callback) {
  var spawn = require('child_process').spawn,
      ps    = spawn('ls', ['-la']),
      grep  = spawn('grep', ['bananas']);

  ps.stdout.on('data', function (data) {
    grep.stdin.write(data);
  });

  ps.stderr.on('data', function (data) {
    console.log('ps stderr: ' + data);
  });

  ps.on('exit', function (code) {
    if (code !== 0) {
      console.log('ps process exited with code ' + code);
    }
    grep.stdin.end();
  });

  grep.stdout.on('data', function (data) {
    console.log('' + data);
  });

  grep.stderr.on('data', function (data) {
    console.log('grep stderr: ' + data);
  });

  grep.on('exit', function (code) {
    if (code !== 0) {
      console.log('grep process exited with code ' + code);
    }
    callback();
  });
}

function series(i) {
  if (i < 1000) {
    callpsgrep( function() {
      return series(i+1);
    });
  }
}
series(0);
4

1 に答える 1

1

exitイベントではなく、 closeイベントで grep の stdin を閉じます。

ps.on('exit', function (code) {
  if (code !== 0) {
    console.log('ps process exited with code ' + code);
  }
});

ps.on('close', function (code) {
  grep.stdin.end();
});

十分に文書化されていませんが、ヘルプファイルで次のことを読みました。

イベント: 「終了」

子プロセスの stdio ストリームがまだ開いている可能性があることに注意してください。

イベント: 'close'#

このイベントは、子プロセスの stdio ストリームがすべて終了したときに発行されます。複数のプロセスが同じ stdio ストリームを共有する可能性があるため、これは「終了」とは異なります。

于 2013-01-26T01:36:56.183 に答える