サブプロセスから stdout/stderr (および私が導入している新しい stdlog) を個別に読み取り、これらのストリームで何かを行い、それらを画面とログ ファイルに同じ順序で書き込めるようにしたいと考えています。
したがって、たとえば、サブプロセスが「aa」を stdout に、次に「bb」を stderr に、「cc」を stdout にもう一度言いたい場合、画面に「aabbcc」が表示されるようにします。「aaccbb」なら許容できる(仕方ないかな)が、「aacbbc」(1つのバグチャンク「cc」に書かれたものを分割したもの)は絶対に見たくない。
だから、ここに私が思いついたプロセス階層があります:
(P) parent process
\_ (O) logger for stdout
\_ (E) logger for stderr
\_ (C) monitored process
- (C) stdout は、ログファイルと stdout に書き込む (O) プロセスへのパイプを使用して接続されます。
- (C) stderr は、ログファイルと stderr に書き込む (E) プロセスへのパイプを使用して接続されます。
問題は、(O) と (E) がいつスケジュールされるかによって、一般的な出力 ((O) と (E) の出力で構成される) が順不同になる可能性があることです。
私ができる方法はありますか:
- 完璧な注文がありますか?いいえ、おそらく解決策があると思います...
- 少なくとも (O) および (E) プロセスで読み取るバイト数を正確に知っているので、それらをまとめて取得できますか?
そして、できればpythonを使用し、ユニックス間で移植可能です。
注: コードはgithubにあります。全体的なアイデアは、監視対象のプロセスの正確な出力をキャプチャし、ログ ファイルに保存することです。stderr または stdout からの出力を書き込む前に、"\0err\0" や "\0std\0" などのログ ファイル マーカーを書き込んで、後で stdout と stderr を考慮して、プロセスから正確な出力を再生成できるようにします。
ありがとうございました