bashから2つのプロセスを作成します。いずれかのプロセスが終了すると、両方のプロセスが終了します。

bashから2つのプロセスを作成します。いずれかのプロセスが終了すると、両方のプロセスが終了します。

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テストコマンドとして使用されます)

bashCHLDトラップは、このオプションがオンのときにのみ実行されるようです。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

おすすめ記事