在父进程中仅为多个子进程使用一个写入流

时间:2016-12-01 09:03:35

标签: node.js stream node.js-stream

假设我有多个node.js子进程,我希望他们的stdout / stderr都写入同一个文件。

在父进程中,理想情况下我可以为文件创建一个流,如下所示:

const cp = require('child_process');
const strm = fs.createWriteStream('bar.log');

async.each([1,2,3], function(item, cb){

 const n = cp.spawn('node', ['foo' + item + '.js']);

 n.stdout.pipe(strm);
 n.stderr.pipe(strm);

 n.on('close', cb);

}, function(err){
 if(err) throw err;
});

可能会发生的是我们会收到错误:

Error: write after 'end'

以下似乎解决了这个问题,我们为每个子进程创建了一个新流:

const cp = require('child_process');

async.each([1,2,3], function(item, cb){

 const n = cp.spawn('node',['foo' + item + '.js']);

  //create a new stream for every child process...
 const strm = fs.createWriteStream('bar.log');

 n.stdout.pipe(strm);
 n.stderr.pipe(strm);

 n.on('close', cb);

}, function(err){
    if(err) throw err;
});

即使孩子开始结束活动,有没有办法“保持溪流畅通”?似乎没有必要为每个子进程创建一个新流。

1 个答案:

答案 0 :(得分:1)

如果结果流未关闭,您需要将end选项设置为false

 n.stdout.pipe(strm, {end: false});
 n.stderr.pipe(strm, {end: false});