由于我是 Linux 新手,如果我没有使用正确的术语,请道歉。
我正在尝试并行运行多个任务(使用后台 shell 操作符)。但是,我需要首先并行运行两个任务,然后(仅在完成后)运行取决于前两个任务结果的其余任务。
例如,假设任务A.1
和A.2
可以并行运行(它们之间没有依赖性)并生成一些将由任务B.1
、B.2
和使用的文件B.3
。所有B
任务都是独立的;但是,他们无法开始A.1
并A.2
完成才能查看文件。考虑到这一点,我想出了以下 shell 脚本:
script1
有以下几行:
./A.1 &
./A.2 &
script2
有以下几行:
./B.1 &
./B.2 &
./B.3 &
script3
只需按顺序调用脚本 1 和 2(即不使用&
运算符),如下所示:
./script1
./script2
我不确定是否script3
是我要找的。我做对了吗?换句话说,会script2
等到script1
完成然后开始吗?
答案1
不,那不会达到你想要的效果。但实际上比这更简单。
首先,从简单的层面来说,你的分析是正确的。如果script3
说
./script1
./script2
然后,是的,script3
将等待script1
完成,然后开始script2
。问题是,它将script1
基本上立即“完成”——即,以产生两个进程所需的时间量A
——因此命令将在命令仍在运行B
时启动。A
不是你想要的。
解决办法是
./A.1 &
./A.2 &
wait
./B.1 &
./B.2 &
./B.3 &
该wait
命令(顾名思义)等待现有异步进程终止,然后再继续。
该wait
命令必须由生成进程的同一个 shell 执行A
。您可以将所有六个命令放入一个脚本中,或者将前三个命令放入一个脚本中,将后三个命令放入另一个脚本中,或者进行各种其他组合。
另外,您可能还想在命令wait
之后执行 aB
操作。