2016-12-01 8 views
0

Скажите, что у меня есть несколько дочерних процессов 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

К полученному потоку не был закрыт для записи вам необходимо установить опцию end в false:

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

приятно, надеюсь, что это работает, спасибо! –

+0

@AlexanderMills Что вы говорите? Оно работает? –

+0

Подтверждено, что это сработало, пришлось использовать его для чего-то еще, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^