从 bash 生成两个进程,如果有一个兄弟退出,则两个进程都退出

pes*_*kal 6 bash process

从 bash 中,我生成了两个进程。这两个过程相互依赖。如果其中一个死亡,我希望两者都退出。最干净的方法是什么?目前我有以下几点:

# start process a
/bin/program_a;
a_pid=$!

# start process b
/bin/program_b;
b_pid=$!

# kill process b if process a exits
wait $a_pid
echo "a_pid died, killing process b"
kill -9 $b_pid
Run Code Online (Sandbox Code Playgroud)

但这只会在进程 a 死亡时帮助进程 b 退出。如果进程 b 死亡,我如何也使进程 a 退出?

Sté*_*las 8

zsh

pids=()
trap '
  trap - CHLD
  (($#pids)) && kill $pids 2> /dev/null
' CHLD

sleep 2 & pids+=$!
sleep 1 & pids+=$!
sleep 3 & pids+=$!

wait
Run Code Online (Sandbox Code Playgroud)

(这里sleep用作测试命令)。

有了bash它似乎在CHLD陷阱只运行在m选项上。您不想在该选项下启动您的作业,因为这会在单独的进程组中运行它们。另请注意,在处理程序中重置处理程序似乎不适用于 bash。所以bash等价的将是这样的:

pids=()
gotsigchld=false
trap '
  if ! "$gotsigchld"; then
    gotsigchld=true
    ((${#pids[@]})) && kill "${pids[@]}" 2> /dev/null
  fi
' CHLD

sleep 2 & pids+=("$!")
sleep 1 & pids+=("$!")
sleep 3 & pids+=("$!")

set -m
wait
set +m
Run Code Online (Sandbox Code Playgroud)