bashで複数の子プロセスを並行で実行して終了を待つには &
でバックグラウンド処理しつつ wait
で待つことで実現できるのですが、この方法だと Ctrl+c
したときに子プロセスが残ってしまいます。
( command1 & command2 & wait )
ここで、jobs -p
を使えば、子プロセスのPID一覧が取得できるので、trap
を使って SIGINT
をトラップしたときに、jobs -p
で得られたPIDを kill
すれば子プロセスも kill することができます。
( trap 'kill $(jobs -p)' EXIT; command1 & command2 & wait )
しかし、jobs -p
は zsh
だとうまく動かないので、この場合は bash -c
を使って実行する必要があります。
bash -c " trap 'kill \$(jobs -p)' EXIT; command1 & command2 & wait "