并行运行命令,并等待一组命令完成后再启动下一个命令


12

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

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

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

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

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

脚本正在退出,并显示一条错误消息!


2
你是什​​么意思,一起跑步。您是说同时并行运行吗?您怎么知道它“无法正常工作?” 您如何知道它何时正常工作?您是否要等待第一个组完成才能运行下一个组?
罗伯特·L

@RobertL。是的,我是说同时并行。脚本正在退出,并显示一条错误消息。是的,我需要等待第一个组完成才能运行下一个组。

1
@goro引用您,脚本正在退出,并显示一条错误消息。请编辑您的问题以添加此类消息(为完成起见)并删除聊天(建议多加指教)。
dave_alcarin 2015年

是否在每个实例中运行相同的命令?一样的名字?
罗伯特·L

1
@goro,这个准确吗?“您有几组命令。在每组中,命令应并行运行(同时)。这些组应按顺序运行,等待一组完成后再开始下一组。”
RobertL

Answers:


20

每组中的命令并行运行,并且各组按顺序运行,每组并行命令在开始执行之前等待上一组完成。

以下是一个工作示例:

假定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
$   

我认为,在您的示例中,冰壶完全没有意义。Wait是全局进程,在这种情况下,卷曲的组不会创建新的派生。
PSkocik 2015年

1
@PSkocik,是。前庭器官。
RobertL

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

应该可以工作(每个三元组组件将顺序运行,但是hte组将并行运行)。您可能不希望您的父外壳程序在组完成之前退出-因此wait


2
最初的问题只说“每3个命令一起运行”。未经澄清,任何答案都是正确的。好电话了wait
罗伯特·L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.