2016-08-21 9 views
3

を混合防ぐため、一つのファイルに書き込む:問題は、出力が最終にアップ混合してもよいということである2つのプロセスが同じように、私は2つのプロセスからの出力を取得し、一つのファイルにマージしたい出力

proc1 >> output & 
proc2 >> output & 

ファイル。例えば 最初のプロセスが書き込んだ場合:

hellow

を第2の処理は、書き込み:

BYE

結果のようなものであってもよい。

hebylloe

が、私は(順序は重要ではありません)それらのような別々のラインであることを期待:

さようなら

ハロー

だから私は同期するために群れを使用次のスクリプトを使用してファイルに書き込みます。

exec 200>>output 
while read line; 
    flock -w 2 200 
    do echo $line>>output 
    flock -u 200 
done 

などのプロセスを実行します。

proc1 | script & 
proc2 | script & 

を今の問題は、性能が大幅に減少していることです。同期を行わないと、各プロセスは4MB /秒の速度で書き込むことができますが、同期スクリプトを使用すると、書き込み速度は1MB /秒になります。

2つのプロセスからの出力をマージし、出力のミキシングを防ぐ方法を教えてもらえますか?

編集: 私は、行の長さと標準バッファのサイズの間に関係があり、各行のサイズが標準のバッファサイズより小さければすべてがうまく動作し、何も混在しないことを認識しました(少なくとも私のテストでは) 。 bufsizeコマンドで各スクリプトを実行しました。

bufsize -o10KB proc1 | script & 
bufsize -o10KB proc2 | script & 

ここでは、このソリューションが防弾であることを確認します。私はバッファサイズと現在何が起こるかとの間に何らかの関係を見つけることができません!

+1

あなたは2つのだけのプロセスを持っている場合は、なぜ2つの出力ファイルを書き込めませんし、その後、その後、それらをマージ?それをスケールアップする必要がある場合は、log4jのようなアペンダーを使用して調べてください。 – xxfelixxx

+0

'echo" $ line ">> output'(引用符で囲む)を使用する方が良い(問題を解決しない)方がいいです。 –

+0

何を書いていますか?プレーンなログファイルの場合、2つのprocsが同じファイルに書き込むと、大量のデータを読み込むヒーローは混乱します。または、あなたはいつかデータベースに行く何かを書いていますか?今すぐ始めましょう。何らかの理由で –

答えて

2

ここで、このソリューションが防弾であることを確認します。私は バッファサイズと現在何が起こるかの関係を見つけることができません!

完全にバッファリングされた出力ストリームの場合、バッファサイズによって、1回の書き込みで書き込まれるデータ量が決まります。write(2)行バッファー出力ストリームの場合、バッファー・サイズを超えない限り、行は単一のwrite(2)呼び出しで書き込まれます。

ファイルが O_APPENDオープン(2)編だった場合は、ファイルオフセットは、最初に書き込む前に、ファイル の末尾に設定されています。ファイルオフセットの調整および書き込み 操作は、アトミックステップとして実行されます。

はまた、これらの回答を参照してください。

+0

Armaliありがとうございますが、私のLinuxシェルのリダイレクト(>>)実装がwrite(2)、write(3)、write(3)のようなものを保証していないことに基づいているかどうかを確認するにはどうすればいいですか? –

+0

@ayyoob imani:POSIXマニュアルから['write(3)'](http://linux.die.net/man/3/write)を意味しますか? Linuxではもちろん、Linuxの実装['write(2)'](http://linux.die.net/man/2/write)が有効です。 – Armali

+0

それに加えて、POSIXでは、ファイルステータスフラグのO_APPENDフラグがセットされていると、ファイルオフセットは各書き込みの前にファイルの最後に設定され、ファイルオフセットの変更とファイルオフセットの変更の間にwrite操作_および_その書き込みによって変更されたファイル内の各バイト位置からの成功したread()は、そのバイト位置が再び変更されるまでその位置のwrite()によって指定されたデータを返すものとする。_これらの_shall_要件は満たされるオペレーティングシステムのカーネルによって。 – Armali

関連する問題