Bashで2つのプロセスを作成しました。これら2つのプロセスは相互依存的です。どちらかが死んだら、どちらもやめたいです。最もきれいな方法は何ですか?現在私は以下を持っています:
# 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
ただし、これはプロセスaが終了した場合にのみプロセスbを終了するのに役立ちます。プロセスbが終了したら、プロセスを終了する方法は?
ベストアンサー1
そしてzsh
:
pids=()
trap '
trap - CHLD
(($#pids)) && kill $pids 2> /dev/null
' CHLD
sleep 2 & pids+=$!
sleep 1 & pids+=$!
sleep 3 & pids+=$!
wait
(ここでは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