Запись в поток непосредственно перед тем, как событие 'end' запущено

Я использую несколько child_process с родительским процессом Node.js и передаю все stderr из дочерних процессов в файл.

Вот так:

    const strmPath = path.resolve(projRoot + '/suman/stdio-logs/runner-stderr.log');
    const strm = fs.createWriteStream(strmPath);


    //before I call pipe I write some stuff to the log file
    strm.write('\n\n>>> Suman start >>>\n');
    strm.write('Beginning of run at ' + Date.now() + ' = [' + new Date() + ']' + '\n');
    strm.write('Command = ' + JSON.stringify(process.argv) + '\n');


    // when the parent process exits, I want to write one more line to the log file

    process.on('exit', function (code, signal) {

        strm.write('<<<<<< Suman runner end <<<<<<\n');


    });

в родительском процессе я передаю данные в файл следующим образом:

    const n = cp.fork(path.resolve(__dirname + '/run-child.js'), argz, {silent: true});


    n.on('message', function (msg) {
        handleMessage(msg, n);
    });


    n.stdio[2].setEncoding('utf-8');
    n.stdio[2].pipe(strm);

проблема в том, что событие 'end' запускается в потоке до того, как произойдет process.on ('exit'). На самом деле, кажется, что нет способа подключиться к потоку для записи в него до вызова end; ну, на самом деле я ищу какой-то способ подключиться к потоку, чтобы перед вызовом end я мог написать ему хотя бы один раз.

Есть ли способ сделать это?

(Кроме того, я также ищу способ передать поток child_process stderr в файл напрямую, без необходимости сначала проходить через родительский процесс. Это, вероятно, можно сделать, просто вызвав process.stderr.pipe() в каждом child_process)

1 ответ

Решение

Может быть, это может помочь:

Здесь автоматическое закрытие strm предотвращается, когда n.stdio[2] закрывается. Таким образом, вы можете закончить strm Поток вручную с последним куском куска.

n.stdio[2]
.on('end', function(){
  strm.end('<<<<<< Suman runner end <<<<<<\n');
})
.pipe(strm, {end: false})
Другие вопросы по тегам