web-dev-qa-db-ja.com

top / htopでプロセスのツリーを殺す

htop を使用すると、シェル内のプロセスのツリーをきれいに表示できます。 F9 (KILL)を押して、どのシグナルを選択するかによってプロセスを強制終了できます(例:15 SIGTERM)殺すために仕事に送りたいです。

ただし、これにより、一度に1つのプロセスしか強制終了できません。 htopを使用してプロセスのツリー全体を強制終了する方法はありますか?

12

man htopから:

インタラクティブなコマンド

Spaceプロセスにタグを付けたり、タグを外したりします。 「kill」などの複数のプロセスを操作できるコマンドは、現在強調表示されているプロセスではなく、タグ付きプロセスのリストに適用されます。

[〜#〜] u [〜#〜]すべてのプロセスのタグを解除します(スペースキーで追加されたすべてのタグを削除します)。

F9、k "Kill"プロセス:メニューで選択されたシグナルを1つまたはプロセスのグループに送信します。 プロセスにタグが付けられている場合、シグナルをすべてのタグ付きプロセスに送信します。タグが付けられていない場合は、現在選択されているプロセスに送信します。

あなたが探していた答えではありませんが、近いです。 killを使用してプロセスグループまたは子を削除することもできます。以下を参照してください。

https://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes

16
goldilocks

これには長い間機能がありましたが、2018年までマニュアルにはありませんでした。cキーを押して、現在ハイライトされているプロセスとそのすべての子を選択します。次に、選択したプロセスに適用される操作(kキーを使用した強制終了など)がプロセスとその子に適用されます。

ただし、これはアトミックではありません。 cを押してからカーネルがすべてのプロセスを強制終了するまでの間に新しい子が生成される場合、それらは強制終了されず、おそらくinitプロセスに再接続されます。これは、htopが選択したプロセスでループし、それらを1つずつ強制終了するためです。

先ほどhtopにアトミックグループキリング機能を追加するために パッチを提案 をしましたが、実装がマージされるのに十分な合意がありませんでした。これにより、htopからプロセスグループ全体をアトミックに強制終了できます。それはツリー全体を殺すことと正確には同じではありませんが、私の知る限り、カーネルは任意のツリーをアトミックに殺す方法を提供していません。

1
Arkanosis

Htopマンページから:

F5、tツリービュー:親子関係でプロセスを整理し、プロセス間の関係をツリーとしてレイアウトします。キーを切り替えると、ツリーと以前に選択した並べ替えビューが切り替わります。並べ替えビューを選択すると、ツリービューが終了します。

F5キーを押すと、 't'キーを押す必要がある場合があります。ツリー全体を殺すことができます。

1
Stephan

htopsコマンドを乗っ取ることができます。 htopでは、sを押すとstrace -p <the-pid-of-the-selected-process>が呼び出されます。

次に、次のような内容を含むstraceコマンドを作成します。

#! /bin/sh -
pids=$(ps -eo pid= -o ppid= |
  awk -v exclude="$PPID" -v pid="$2" '
    function descends(p) {
      if (p == exclude) return 0
      if (p == pid) return 1
      if (p <= 1) return 0
      return descends(parent[p])
    }
    { parent[$1]=$2 }
    END {
      for (p in parent)
        if (descends(p))
         print p
    }'
)
if [ -z "$pids" ]; then
  echo >&2 "No process found to kill"
else
  echo >&2 Killing $pids
  kill $pids
fi

そして、それを~/.htop-Hijackのようなディレクトリに置き、次のようにhtopを呼び出します。

PATH=~/.htop-Hijack:$PATH htop

次に、sを押すと、straceの代わりにそのコマンドが呼び出されます(後でメイン画面に戻るには、Escを押す必要があります)。

1