web-dev-qa-db-ja.com

Aの標準出力をBに並列にパイプするのは安全ですか?

A file | B --params > file.txtを実行しています。処理速度を上げたいので、parallel -j+0< a.txtを使って20個のジョブを同時に実行しました。 a.txtには、すべてのコマンドが含まれています。

A file1 | B --params > file1.txt 

A file2 | B --params > file2.txt

A fileN | B --params > fileN.txt

この方法は安全ですか?並行して実行すると、異なるプログラムのstdoutが混乱しますか?

6
Sean

並行して実行すると、異なるプログラムのstdoutが混乱しますか?

それらがすべて別々のファイルに書き込む独立したプロセスである場合はそうではありません。Bの各インスタンスは別個であり、独自の場所に出力されます。

9
goldilocks

Bの各インスタンスが異なるファイルに書き込む限り、問題はありません。ただし、このアプローチの安全性は最終的にBに依存します。

たとえば、私は過去に、あなたのソリューションに似た何かをしようとしたときに、コーディングが不十分なプログラムに噛まれました。私の場合、プログラムはsrand(time(NULL))を使用してから、Rand()ベースの一時ファイルに書き込みました。プログラムの10個のインスタンスがすべて同じ一時ファイルに書き込まれたため、同時に開始されたときにこれはひどく壊れました。

プログラムにそのようなバグが含まれておらず、固定パスに書き込まれない限り、問題はありません。

2
nneonneo

これがnot安全である唯一の状況は、AまたはBがプログラムにハードコードされているリソース(例:/ etc/passwd)に書き込む場合です。

しかし、大多数のプログラムでは、notの場合です。したがって、それらを並行して実行しても安全です。

1
Ole Tange