シェルが強制終了した場合、両方のコマンドも終了するように、Bashで両方のコマンドを並列に実行する方法はありますか?
簡単な方法は&
動作しません。
sh -c 'sleep 6 & sleep 3'
そうすれば、死んでも最初の人はsleep
歩き続けるでしょう。sh
ベストアンサー1
Trapを使用する@lesmanaのソリューションは伝統的なアプローチですが、述べたようにこのkill -9
状況を処理することはできません。
メインプロセスを監視し、メインプロセスが終了したときにkillコマンドを実行するようにプロセスを設定する代替方法があります。モニタリングを実行する簡単な方法は、モニターのパイプを設定することです。そして、メインプロセスが終了すると、カーネルはモニターが検出できるパイプを閉じます。
これは例です
#!/bin/bash
# show monitoring main process - Icarus Sparry
# [email protected]
# Handler function. Reads from stdin. If it doesn't read the word clean
# then send SIGINT to the process group.
handler(){
read
[ "$REPLY" = "clean" ] || kill -INT -$$
}
# invoke handler as a coprocess.
coproc handler
# some work in the background, wait for 20 seconds and print a message
{ sleep 20 ; echo bye 20 ; } &
# some work in the foreground
sleep 5 ; echo bye 5
# At this point tell the coprocess it was a clean end, so don't
# terminate the background
echo clean >&"${COPROC[1]}"
bye 5
このコマンドを実行すると、5秒後と15秒後に出力されますbye 20
。プロセスを終了すると、セカンダリプロセスはバックグラウンドスリープモードを終了します。
フォアグラウンド操作が完了したときにバックグラウンド処理を終了するには、Final を省略し、オプションecho clean >&"${COPROC[1]}"
でハンドラから削除し、[ "$REPLY" = "clean" ] ||
読み取りと終了はそのままにします。