一部のサブプロセス呼び出しを単純化するために、bashスクリプトでいくつかの機能を使用しようとしています。プロセスをバックグラウンドでジョブとして実行するか、フォアグラウンドでジョブとして実行するかを呼び出しサイトで決定し、必要に応じてサブプロセスを終了したいと思います。残念ながら、私が知っている限り、私が得たpidは、$!
長期実行バックグラウンドプロセスに属さずにそれを呼び出した関数に属します。私は$を使用して得たpidを殺す!長期実行サブプロセスは終了せず、孤児のように見えます。
function inner() {
tail -f /dev/null
}
function outer() {
inner
}
outer &
echo 'Before, $!: ' $!
echo 'Before, jobs -p: ' $(jobs -p)
echo 'Before, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)
kill $!
echo 'After, $!: ' $!
echo 'After, jobs -p: ' $(jobs -p)
echo 'After, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)
私が得た結果は次のとおりです。
Before, $!: 71644
Before, jobs -p: 71644
Before, ps aux: jstaab 71646 0.0 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null
After, $!: 71644
After, jobs -p: 71644
./test.sh: line 17: 71644 Terminated: 15 outer
After, ps aux: jstaab 71646 0.4 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null
これが私に別のpidをps aux
提供していることがわかります。これは意味がありますが、grepコマンドなしでどのように殺すことができますか?$!
jobs -p
tail -f /dev/null
kill
答え1
outer &
サブシェルを作成します。$!
このサブシェルのPIDを提供します。
tail -f /dev/null
このサブシェルの子なので、PIDが異なります。しかし、あなたはできます。
exec tail -f /dev/null
代わりに。次に、kill
をクリックしますtail
。
/bin/kill
もう1つの可能性は、組み込みシェルを代わりに使用することです。引数として負の数を使用すると、プロセスグループ全体を終了できます。
/bin/kill -TERM -$!