htop使我可以很好地看到shell中的进程树。我可以通过按F9 (KILL)
然后选择15 SIGTERM
要发送给作业的信号(例如)来杀死进程。
但是,这只允许我一次杀死一个进程。有没有办法杀死使用的完整进程树htop
?
htop使我可以很好地看到shell中的进程树。我可以通过按F9 (KILL)
然后选择15 SIGTERM
要发送给作业的信号(例如)来杀死进程。
但是,这只允许我一次杀死一个进程。有没有办法杀死使用的完整进程树htop
?
Answers:
来自man htop
:
互动命令
空格 标记或取消标记进程。然后,可以对多个进程(例如“ kill”)进行操作的命令将应用于已标记进程的列表,而不是当前突出显示的进程。
U 取消所有进程的标签(删除所有用空格键添加的标签)。
F9,k “杀死”过程:将在菜单中选择的信号发送到一个或一组过程。如果标记了进程,则将信号发送到所有标记的进程。 如果没有标记,则发送到当前选定的进程。
不是您要找的答案,而是接近的答案。您还可以消除进程组或带有杀死的子项,请参阅:
你可以劫持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
到内核杀死所有进程之间产生了新的子进程,它们将不会被杀死,并且很可能最终会重新附加到初始化进程中。这是因为htop在选定的进程上循环并逐一杀死它们。
我已经提出了一个修补程序,以在htop之前添加一个原子的组杀死功能,但是这种实现方式不够共识,无法将其合并。有了它,就有可能从htop原子地杀死整个进程组。这与杀死一整棵树并不完全相同,但是AFAIK内核并没有提供任何方法来原子杀死任意一棵树。