55

私はいくつかのことを行うbashスクリプトを書いています。

最初にいくつかの監視スクリプトを開始し、それぞれが他のツールを実行します。

メイン スクリプトの最後で、シェルから生成されたすべてのものを削除したいと考えています。

したがって、次のようになります。

#!/bin/bash

some_monitor1.sh &
some_monitor2.sh &
some_monitor3.sh &

do_some_work
...

kill_subprocesses

問題は、これらのモニターのほとんどが独自のサブプロセスを生成するため、(たとえば): を実行してkillall some_monitor1.shも常に役立つとは限りません。

この状況を処理する他の方法はありますか?

4

7 に答える 7

32

各子プロセスを開始した後、そのIDを取得できます

ID=$!

次に、格納された PID を使用して、ここまたはここで説明されているように、すべての孫などのプロセスを見つけて強制終了できます。

于 2010-04-11T19:38:45.467 に答える
28

負の PID を使用するkillと、プロセス グループが強制終了されます。例:

kill -- -1234

于 2010-04-11T20:49:06.950 に答える
11
kill $(jobs -p)

Rhys Ulerichの提案:

[以下のコード] を使用して競合状態に注意してください

[[ -z "$(jobs -p)" ]] || kill $(jobs -p)
于 2010-04-11T20:04:07.497 に答える
5

オプション "-P" を指定した pkill が役立ちます。

pkill -P $(pgrep some_monitor1.sh)

マンページから:

   -P ppid,...
          Only match processes whose parent process ID is listed.

linuxquests.org でいくつかの議論が行われています。以下を確認してください。

http://www.linuxquestions.org/questions/programming-9/use-only-one-kill-to-kill-father-and-child-processes-665753/

于 2010-04-12T10:27:24.543 に答える