2

我一直在修改 node,在尝试学习 child_process 模块时,我遇到了一个问题。我试图序列化许多对 'ps -eF | 的调用。grep ssh',但它在我的系统上崩溃并出现以下错误。所以两个问题。首先,有没有更好的方法可以在没有图书馆的情况下做我正在尝试的事情?其次,为什么它不起作用:)

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

在关闭事件而不是退出事件上关闭 grep 的标准输入。

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 流可能仍处于打开状态。

事件:'关闭'#

当子进程的 stdio 流全部终止时会发出此事件。这与“退出”不同,因为多个进程可能共享相同的 stdio 流。

于 2013-01-26T01:36:56.183 回答