从 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 退出?
与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)