process.stdout.write / process.stderr.write monkey-patch работает в дочернем процессе, но не в родительском

Итак, у меня есть этот простой обезьяний патч на process.stdout.write / process.stderr.write

    const strm = fs.createWriteStream(logfile);
    const stdoutWrite = process.stdout.write;

    process.stdout.write = function () {
      strm.write.apply(strm,arguments);
      stdoutWrite.apply(process.stdout, arguments);
    };

(для process.stderr он идентичен и пишет в тот же поток).

Проблема:

Когда я запускаю этот процесс с node x.js

Поток не завершает всю запись перед закрытием, даже не закрывает. Однако, если я бегу

$ node y.js  # this runs x.js in child process

теперь поток, запущенный в дочернем элементе, завершит запись, и файл журнала будет заполнен.

С чего бы это? Если не считать использования fs.appendFileSync, есть ли способ гарантировать, что поток истощится до закрытия процесса?

ИЗМЕНИТЬ:

Я думаю, что знаю, почему это происходит - я вызываю process.exit(), который преждевременно закроет процесс и, вероятно, будет вызван до завершения потока.

Есть ли способ прослушать, когда поток закончит запись? Если вызовите finish() в потоке, когда я вызываю process.exit(), это кажется искусственным «финишем». Я пытался дождаться события «слива», но, похоже, оно никогда не срабатывает.


person Alexander Mills    schedule 19.04.2017    source источник


Ответы (1)


Потоковая передача write и end может принимать обратный вызов после завершения операции.

stream.end('end!', ()=> process.exit(0))

Событие drain срабатывает только после того, как вы сможете возобновить запись в поток, который ранее не удалось выполнить или заблокировал. .

Я не совсем уверен в семантике обратного вызова end/write при ошибке. Возможно, вам придется добавить тайм-аут, конечно, если запись блокирует, обратный вызов не будет выполняться до тех пор, пока данные не будут сброшены.

stream.end('end!', ()=> process.exit(0))
setTimeout(()=> {
  console.log('end timed out')
  process.exit(1)
}, 2000)
person Matt    schedule 19.04.2017