并行运行命令并等待一组命令完成后再开始下一组命令

19 shell shell-script process-management background-process wait

我有包含多个命令的脚本。如何将命令分组在一起运行(我想制作几组命令。在每个组内,命令应该并行运行(同时)。这些组应该顺序运行,等待一组完成后再开始下一组)...即

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10
Run Code Online (Sandbox Code Playgroud)

我怎样才能每 3 个命令运行一次?我试过:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
Run Code Online (Sandbox Code Playgroud)

但这不能正常工作(我想同时并行运行多组命令。另外,我需要等待第一组完成后再运行下一组)

脚本退出并显示错误消息!

Rob*_*rtL 30

每组内的命令并行运行,各组依次运行,每组并行命令在开始执行之前等待前一组完成。

以下是一个工作示例:

假设有 3 组命令,如下面的代码所示。在每组中,三个命令在后台以&.

这 3 个命令将几乎同时启动并在脚本waits完成时并行运行。

第三组中的三个命令全部退出后,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
$   
Run Code Online (Sandbox Code Playgroud)

  • @PSkocik,没错。残留器官。 (2认同)

PSk*_*cik 10

{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===
Run Code Online (Sandbox Code Playgroud)

应该工作(每个单独的三元组将按顺序运行,但 hte 组将并行运行)。您可能不希望您的父 shell 在组完成之前退出 - 因此wait.

  • 最初的问题只说“一起运行每 3 个命令”。没有澄清,任何一个答案都是正确的。对“等待”的良好呼吁。 (2认同)