私はLinuxに初めて触れたので、正しい用語を使用しなかった場合は謝罪します。
複数のジョブを並列に実行しようとしています(バックグラウンドシェル演算子を使用)。ただし、最初に2つのジョブを並列に実行してから(完了後にのみ)、最初の2つのジョブの結果に基づいて残りのジョブを実行する必要があります。
たとえば、ジョブとがA.1
並列A.2
に実行され(それらの間に依存関係がない)、ジョブで使用するいくつかのファイルを生成できるとしB.1
ます。すべての操作は独立していますが、ファイルを表示する前に開始または完了することはできません。これを念頭に置いて、次のようなシェルスクリプトを考えました。B.2
B.3
B
A.1
A.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
開始されます。あなたが望むものではありません。B
A
解決策は
./A.1 &
./A.2 &
wait
./B.1 &
./B.2 &
./B.3 &
このwait
コマンド(名前が示すように)は、続行する前に既存の非同期プロセスが終了するのを待ちます。
このwait
コマンドは、プロセスを作成したのと同じシェルで実行する必要がありますA
。 6つのコマンドをすべて1つのスクリプトに配置したり、最初の3つのコマンドを1つのスクリプトに配置したり、最後の3つのコマンドを別のスクリプトに配置したり、他のさまざまな組み合わせを配置したりできます。
また、コマンドの後にアクションをwait
実行することもできます。B