后台任务与前台任务以及并行运行任务

后台任务与前台任务以及并行运行任务

由于我是 Linux 新手,如果我没有使用正确的术语,请道歉。

我正在尝试并行运行多个任务(使用后台 shell 操作符)。但是,我需要首先并行运行两个任务,然后(仅在完成后)运行取决于前两个任务结果的其余任务。

例如,假设任务A.1A.2可以并行运行(它们之间没有依赖性)并生成一些将由任务B.1B.2和使用的文件B.3。所有B任务都是独立的;但是,他们无法开始A.1A.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操作。

相关内容