首页 > 解决方案 > Shell:如何并行运行两个脚本A和B并在A结束时停止B

问题描述

假设我有一个 shell 脚本A.sh,其内容是:

sleep 2
echo "A: 2s"
sleep 2
echo "A: 4s"
sleep 2
echo "A: 6s"

我还有一个 shell 脚本B.sh,其内容是:

sleep 2
echo "B: 2s"
sleep 2
echo "B: 4s"
sleep 2
echo "B: 6s"
sleep 2
echo "B: 8s"
sleep 2
echo "B: 10s"

当我希望并行运行 A 和 B 时,我创建了一个脚本C.sh,其内容是:

sh A.sh &
sh B.sh &
wait

输出是:

B: 2s
A: 2s
A: 4s
B: 4s
A: 6s
B: 6s
B: 8s
B: 10s

这样 A 和 B 可以并行运行。现在我还有一个要求,就是我希望在 A 结束时停止 B。我按照这里提到的步骤并修改C.sh为:

parallel -j2 --halt now,success=1 ::: 'sh A.sh' 'sh B.sh'

输出是:

A: 2s
A: 4s
A: 6s
parallel: This job succeeded:
sh A.sh

看来B没有以这种方式运行。谁能告诉我并行运行两个脚本 A 和 B 并在 A 结束时停止 B 的正确方法是什么?

标签: linuxbashshellparallel-processing

解决方案


并行运行两个脚本 A 和 B 并在 A 结束时停止 B?

所以就这样做吧。

sh B.sh &
b_pid=$!
{
    sh A.sh 
    kill "$b_pid"
} &
wait

推荐阅读