当其中 1 个返回退出代码 1 时,停止所有子进程

当其中 1 个返回退出代码 1 时,停止所有子进程

我有 2 个或更多构建进程要在后台运行。如果其中一个进程以非 0 代码退出,我想停止所有构建进程。

./build-1.sh &
./build-2.sh &
./build-3.sh &
wait
#other steps

目前,我使用wait需要等待所有进程完成的版本。但是,如果其中一个进程失败,我想停止所有其他构建。我该怎么做?

答案1

您正在寻找的通常称为 a named pipe,用于进程间通信 (IPC)。关于在 Bash 中创建命名管道,有很多很棒的文档,所以我将为此编写代码留给您。

一旦有了命名管道,您就可以执行以下操作:将每个进程的 PID 写入管道(使用 Bash 特殊变量$$表示当前 PID),然后让每个进程循环检查每个 PID 是否存在。如果遇到不再存在的 PID(进程死亡或被终止),那么它就可以采取行动。

您可以将类似这样的内容放在脚本的适当部分。请先测试一下。:)

trap "rm -f $named_pipe" EXIT

# Assuming you have a file under $named_pipe with space-delimited PIDs
pids = $(< $named_pipe)
while :
do
  for pid in pids:
  do 
    if ! kill -0 $pid;
    then
      exit
    fi
  done
done

相关内容