関数内で開始されたジョブの終了

関数内で開始されたジョブの終了

一部のサブプロセス呼び出しを単純化するために、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 -ptail -f /dev/nullkill

答え1

outer &サブシェルを作成します。$!このサブシェルのPIDを提供します。

tail -f /dev/nullこのサブシェルの子なので、PIDが異なります。しかし、あなたはできます。

exec tail -f /dev/null

代わりに。次に、killをクリックしますtail

/bin/killもう1つの可能性は、組み込みシェルを代わりに使用することです。引数として負の数を使用すると、プロセスグループ全体を終了できます。

/bin/kill -TERM -$!

関連情報