web-dev-qa-db-ja.com

コマンドを並行して実行し、コマンドの1つのグループが完了するのを待ってから、次のグループを開始します。

複数のコマンドを含むスクリプトがあります。コマンドをグループ化して一緒に実行するにはどうすればよいですか(複数のコマンドグループを作成します。各グループ内で、コマンドは(同時に)実行する必要があります。グループは順次実行され、1つのグループが完了するまで待ってから、次のグループ)... ie.

#!/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

しかし、これは適切に機能しませんでした(コマンドのグループを同時に並行して実行したいです。また、次のグループを実行する前に、最初のグループが完了するのを待つ必要があります)。

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

12
user88036

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

以下は実際の例です。

以下のコードのように、3つのコマンドグループを想定します。各グループで、3つのコマンドは&でバックグラウンドで開始されます。

3つのコマンドはほぼ同時に開始され、スクリプトwaitsが完了するまで並行して実行されます。

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
$   
20
RobertL
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

機能するはずです(各トリプレットコンポーネントは順次実行されますが、グループは並行して実行されます)。おそらく、グループが完了する前に親シェルを終了させたくないので、waitにします。

6
PSkocik