2

を使用して、のstderrストリームをdetached child_processファイルにリダイレクトしています

fd = fs.openSync('./err.log', 'a');

そして、この fd を の stderr として渡しspawnます。

ファイルに書き込まれたデータを傍受する方法を探しています。つまり、その子プロセスが何かを書き込むとき、ファイルに書き込む前に処理したいのです。

書き込み可能なストリームを作成し、ファイル記述子の代わりに生成してみました。しかし、それは役に立ちませんでした。

どうすればそれを達成できるかを誰かが提案できますか?

また、child_process を通常どおり生成し ( )、イベントをdetached = falseリッスンし、準備ができたら、子プロセスをデタッチできますか。したがって、基本的には、初期データが必要で、それをバックグラウンド プロセスとして実行し、親を終了させます。datachild.stdoutchild_process

4

1 に答える 1

1

必要なのはTransform streamです。

問題の可能な解決策は次のとおりです。

var child = spawn( /* whatever options */ )
var errFile = fs.createWriteStream('err.log', { flags: 'w' })
var processErrors = new stream.Transform()
processErrors._transform = function (data, encoding, done) {
  // Do what you want with the data here.
  // data is most likely a Buffer object
  // When you're done, send the data to the output of the stream:
  this.push(data)
  done() // we're done processing this chunk of data
}
processErrors._flush = function(done) {
  // called at the end, when no more data will be provided
  done()
}

child.stderr.pipe(processErrors).pipe(f)

ストリームをパイプする方法に注意してください。stderr は読み取り可能なストリームであり、processErrors は Duplex の Transform ストリームであり、f は書き込み可能なストリームのみです。processErrors ストリームはデータを処理し、受信したとおりに出力します (したがって、ビジネス内部ロジックを内部に持つPassThroughストリームのように見えます)。

于 2013-10-31T14:22:19.333 に答える