バックグラウンドジョブとフォアグラウンドジョブと並列実行ジョブの比較

バックグラウンドジョブとフォアグラウンドジョブと並列実行ジョブの比較

私はLinuxに初めて触れたので、正しい用語を使用しなかった場合は謝罪します。

複数のジョブを並列に実行しようとしています(バックグラウンドシェル演算子を使用)。ただし、最初に2つのジョブを並列に実行してから(完了後にのみ)、最初の2つのジョブの結果に基づいて残りのジョブを実行する必要があります。

たとえば、ジョブとがA.1並列A.2に実行され(それらの間に依存関係がない)、ジョブで使用するいくつかのファイルを生成できるとしB.1ます。すべての操作は独立していますが、ファイルを表示する前に開始または完了することはできません。これを念頭に置いて、次のようなシェルスクリプトを考えました。B.2B.3BA.1A.2

script1次の行があります。

./A.1 & 
./A.2 &

script2次の行があります。

./B.1 &
./B.2 &
./B.3 &

script3次のように、スクリプト1と2を順番に(つまり、&演算子を使用せずに)呼び出すだけです。

./script1
./script2

script3私が探しているものが正しいかどうかはわかりません。私が正しいことをしているのでしょうか?つまり、完了するscript2まで待ってから始めますか?script1

答え1

いいえ、希望の効果が得られません。しかし、実際にはそれよりも簡単です。

まず、簡単なレベルでは、あなたの分析は正確です。script3もし

./script1
./script2

その場合は、完了するscript3まで待っscript1てから始めますscript2。問題はscript1基本的にすぐに「完了」することです。つまり、2つのプロセスを作成するのにかかる時間であるため、コマンドの実行中にコマンドがA開始されます。あなたが望むものではありません。BA

解決策は

./A.1 &
./A.2 &
wait
./B.1 &
./B.2 &
./B.3 &

このwaitコマンド(名前が示すように)は、続行する前に既存の非同期プロセスが終了するのを待ちます。

このwaitコマンドは、プロセスを作成したのと同じシェルで実行する必要がありますA。 6つのコマンドをすべて1つのスクリプトに配置したり、最初の3つのコマンドを1つのスクリプトに配置したり、最後の3つのコマンドを別のスクリプトに配置したり、他のさまざまな組み合わせを配置したりできます。

また、コマンドの後にアクションをwait実行することもできます。B

関連情報