コマンドを並列に実行し、次のコマンドセットを開始する前に、1つのコマンドセットが完了するのを待ちます。

コマンドを並列に実行し、次のコマンドセットを開始する前に、1つのコマンドセットが完了するのを待ちます。

複数のコマンドを含むスクリプトがあります。実行するためにコマンドをグループ化する方法(複数のコマンドグループを作成したい場合は、各グループ内でコマンドを並列に(同時に)実行する必要があります。実行する必要があります。)...つまり。

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10

3つのコマンドを同時にどのように実行できますか?私は試した:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10

しかし、これは正しく動作しません。 (同時に複数の命令セットを並列に実行したいのですが、次のセットを実行する前に最初のセットが完了するまで待つ必要があります。)

スクリプトはエラーメッセージで終了します!

ベストアンサー1

各グループ内のコマンドは並列に実行され、各グループは順番に実行され、各並列コマンドグループは実行を開始する前に前のコマンドグループが完了するのを待ちます。

実際の例は次のとおりです。

以下のコードに示すように、3つの命令セットがあるとします。各グループでは、これら3つのコマンドがバックグラウンドで実行されます&

これら3つのコマンドはほぼ同時に起動され、スクリプトがwaits完了する間に並列に実行されます。

3番目のグループの3つのコマンドは、3つのcommand 10コマンドがすべて終了するまで実行されません。

$ cat command_groups.sh 
#!/bin/sh

command() {
    echo $1 start
    sleep $(( $1 & 03 ))      # keep the seconds value within 0-3
    echo $1 complete
}

echo First Group:
command 1 &
command 2 &
command 3 &
wait

echo Second Group:
command 4 &
command 5 &
command 6 &
wait

echo Third Group:
command 7 &
command 8 &
command 9 &
wait

echo Not really a group, no need for background/wait:
command 10

$ sh command_groups.sh 
First Group:
1 start
2 start
3 start
1 complete
2 complete
3 complete
Second Group:
4 start
5 start
6 start
4 complete
5 complete
6 complete
Third Group:
7 start
8 start
9 start
8 complete
9 complete
7 complete
Not really a group, no need for background/wait:
10 start
10 complete
$   

おすすめ記事