2

サブプロセスから 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 を考慮して、プロセスから正確な出力を再生成できるようにします。

ありがとうございました

4

1 に答える 1

0

stdout と stderr を同じパイプ (つまりproc1 2>&1 | proc2) にリダイレクトすると、パイプの順序を制御できなくなります。これは、これらがまったく同じになるためです。stdout と stderr はどちらも、オペレーティング システム内で同じパスを持ちます。

「proc2」がデータを読み取る順序は、「proc1」がデータを書き込む順序のみに依存します。 その順序は proc1 のみに依存します。

通常、プロセスは次のようにデータをバッファリングします。

  • stdoutはバッファリングされますが、出力が TTY の場合はすべての改行をフラッシュします。それ以外の場合は、バッファがいっぱいの場合です。
  • stderrはバッファリングされておらず、常にすべての書き込みですぐにフラッシュされます。

Python バッファをいじったり、stdout と stderr をまったく同じにすることができますが、おそらく最も簡単な方法はpython -u ...、すべての出力をバッファリングしないようにすることです。これにより、proc1 からの各書き込みが同じ順序で proc2 に表示されるはずです。

于 2013-11-04T20:55:12.107 に答える