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


12

複数のコマンドを含むスクリプトがあります。コマンドをグループ化して一緒に実行するにはどうすればよいですか(コマンドのグループをいくつか作成します。各グループ内で、コマンドは(同時に)実行する必要があります。グループは順次実行され、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

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

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


2
どういう意味ですか、一緒に走りましょう。同時に並列実行するということですか?「正常に機能しなかった」とどうしてわかりますか?それが適切に機能することをどのようにして知っていますか?最初のグループが完了するのを待ってから、次のグループを実行しますか?
RobertL 2015年

@ RobertL.Yes私は同時に並行して意味します。スクリプトはエラーメッセージで終了します。はい、次のグループを実行する前に、5番目のグループが終了するのを待つ必要があります。

1
@goroが引用すると、スクリプトはエラーメッセージで終了します。質問を編集して、このようなメッセージを追加し(完了のため)、おしゃべりを削除してください(アドバイスを歓迎します)。
dave_alcarin 2015年

各インスタンスで実行されている同じコマンドですか?同名?
RobertL 2015年

1
@goro、これは正確ですか?「コマンドのグループがいくつかあります。各グループ内で、コマンドは(同時に)実行される必要があります。グループは順次実行され、次のグループを開始する前に1つのグループが完了するまで待機する必要があります。」
RobertL 2015年

回答:


20

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

以下は実際の例です。

以下のコードのように、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
$   

しかし、あなたの例では、巻き毛はまったく意味がないと思います。待機はプロセスグローバルであり、この場合、縮れたグループは新しいフォークを作成しません。
PSkocik 2015年

1
@ PSkocik、True。痕跡器官。
RobertL

6
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

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


2
元の質問は、「3つのコマンドをすべて一緒に実行する」だけでした。説明がなければ、どちらの答えも正しいです。の良い電話wait
RobertL 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.