htopを使用すると、シェル内のプロセスのツリーをうまく表示できます。プロセスを強制終了するには、を押してF9 (KILL)
から、強制終了15 SIGTERM
するジョブに送信する信号(例)を選択します。
ただし、これにより、一度に1つのプロセスのみを強制終了できます。を使用してプロセスのツリー全体を強制終了する方法はありhtop
ますか?
htopを使用すると、シェル内のプロセスのツリーをうまく表示できます。プロセスを強制終了するには、を押してF9 (KILL)
から、強制終了15 SIGTERM
するジョブに送信する信号(例)を選択します。
ただし、これにより、一度に1つのプロセスのみを強制終了できます。を使用してプロセスのツリー全体を強制終了する方法はありhtop
ますか?
回答:
からman htop
:
インタラクティブなコマンド
プロセスにスペースタグを付けるか、タグを外します。「kill」などの複数のプロセスを操作できるコマンドは、現在ハイライトされているプロセスではなく、タグ付きプロセスのリストに適用されます。
U すべてのプロセスのタグを解除します(スペースキーで追加されたすべてのタグを削除します)。
F9、k "Kill"プロセス:メニューで選択されたシグナルを1つまたはグループのプロセスに送信します。プロセスがタグ付けされている場合は、すべてのタグ付けされたプロセスにシグナルを送信します。 タグが付いていない場合、現在選択されているプロセスに送信します。
あなたが探していた答えではありませんが、近いです。killを使用してプロセスグループまたは子を削除することもできます。以下を参照してください。
htopマンページから:
F5、tツリービュー:親プロセスごとにプロセスを整理し、プロセス間の関係をツリーとしてレイアウトします。キーを切り替えると、ツリーと以前に選択した並べ替えビューが切り替わります。並べ替えビューを選択すると、ツリービューが終了します。
F5キーを押すと、「t」キーを押す必要がある場合があります。ツリー全体を殺すことができます。
htop
のs
コマンドを乗っ取ることができます。では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を押す必要があります)。
これには長い間機能がありましたが、2018年までマニュアルにはありませんでした。c
キーを押して、現在ハイライトされているプロセスとそのすべての子を選択します。次に、選択したプロセスに適用される操作(k
キーを使用した強制終了など)がプロセスとその子に適用されます。
ただし、これはアトミックではありません。押しc
た瞬間とカーネルがすべてのプロセスを強制終了した瞬間の間に新しい子が生成された場合、それらは強制終了されず、おそらくinitプロセスに再接続されます。これは、htopが選択したプロセスでループし、それらを1つずつ強制終了するためです。
少し前にhtopにアトミックグループキリング機能を追加するパッチを提案しましたが、マージするための実装は十分に合意されていませんでした。これにより、htopからプロセスグループ全体をアトミックに強制終了できます。これはツリー全体を殺すこととはまったく同じではありませんが、私の知る限り、カーネルは任意のツリーをアトミックに殺す方法を提供していません。