複数のコマンドを含むスクリプトがあります。コマンドをグループ化して一緒に実行するにはどうすればよいですか(複数のコマンドグループを作成します。各グループ内で、コマンドは(同時に)実行する必要があります。グループは順次実行され、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
しかし、これは適切に機能しませんでした(コマンドのグループを同時に並行して実行したいです。また、次のグループを実行する前に、最初のグループが完了するのを待つ必要があります)。
スクリプトはエラーメッセージで終了します!
各グループ内のコマンドは並行して実行され、グループは順次実行されます。各グループの並行コマンドは、実行を開始する前に前のグループが完了するのを待機します。
以下は実際の例です。
以下のコードのように、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
$
{
command #1
command #2
command #3
} &
{
command #4
command #5
command #6
} &
{
command #7
command #8
command #9
}&
command #10
wait #<===
機能するはずです(各トリプレットコンポーネントは順次実行されますが、グループは並行して実行されます)。おそらく、グループが完了する前に親シェルを終了させたくないので、wait
にします。