在top / htop中杀死一棵进程树


Answers:


16

来自man htop

互动命令

空格 标记或取消标记进程。然后,可以对多个进程(例如“ kill”)进行操作的命令将应用于已标记进程的列表,而不是当前突出显示的进程

U 取消所有进程的标签(删除所有用空格键添加的标签)。

F9,k “杀死”过程:将在菜单中选择的信号发送到一个或一组过程。如果标记了进程,则将信号发送到所有标记的进程。 如果没有标记,则发送到当前选定的进程。

不是您要找的答案,而是接近的答案。您还可以消除进程组或带有杀死的子项,请参阅:

/programming/392022/best-way-to-kill-all-child-processes


1

从htop手册页:

F5,t树视图:按父项组织流程,并将它们之间的关系布置为树。切换键将在树和先前选择的排序视图之间切换。选择排序视图将退出树形视图。

因此,按F5,然后您可能必须按“ t”。那会让你杀死整个树。


1
这仅在“树”不可避免地与其父级绑定时才有效;请注意,htop将线程组显示为树(在这种情况下,分支不是实际的进程)。否则,孤儿将通过init进行重新父代,因此不会被杀死。
goldilocks

我绝对同意,尽管这完全取决于所涉及的过程。例如,杀死一个ssh tree会话将杀死底层的子进程。对于他为什么要杀死整棵树,OP并没有特别明确。
斯蒂芬,

1

你可以劫持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

此功能已经存在很长时间了,但是直到2018年,手册中都没有使用它:c按键以选择当前突出显示的过程及其所有子项。然后,适用于选定进程的操作(例如使用k键进行销毁)将应用于该进程及其子级。

但是,这不是原子的。如果在您按下按钮c到内核​​杀死所有进程之间产生了新的子进程,它们将不会被杀死,并且很可能最终会重新附加到初始化进程中。这是因为htop在选定的进程上循环并逐一杀死它们。

我已经提出了一个修补程序,以在htop之前添加一个原子的组杀死功能,但是这种实现方式不够共识,无法将其合并。有了它,就有可能从htop原子地杀死整个进程组。这与杀死一整棵树并不完全相同,但是AFAIK内核并没有提供任何方法来原子杀死任意一棵树。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.