a_1, a_2, b_1, b_2, c_1, c_2 ジョブを次のように実行したいと思います。 a_i、b_j、c_k(i、j、kは0または1です)を並列に実行できます。ただし、a_2はa_1が完了した直後に実行する必要があります(同じリソースを使用するため、a_2はa_1がリソースを解放するのを待つ必要があります)。 bとcと同じです。
Bashでどうすればいいですか?
答え1
( a_1; a_2 ) &
( b_1; b_2 ) &
( c_1; c_2 ) &
wait
その後、3つのバックグラウンドジョブが実行され、すべてが完了するのを待ちます。 3つのバックグラウンドジョブは、それぞれ対応するコマンドを順番に実行します。
やや複雑な変形の場合:
for task in a b c; do
for num in 1 2; do "${task}_$num"; done &
done
wait
これは同じことを行いますが、文字列などを整理し、a_1
そのa_2
文字列をコマンドで生成することによって発生することを行います。明らかに、これはタスクがこれらの名前を持つ実際のコマンドである場合にのみ機能します。
答え2
GNU並列処理を使用する:
parallel {1}_{2} ::: a b c ::: 0 1
parallel {}_2 ::: a b c
または:
parallel '{}_0; {}_1; {}_2' ::: a b c