我如何通过名称来 pkill 一个进程及其所有子进程?

我如何通过名称来 pkill 一个进程及其所有子进程?

pkill -f 'name' 是不够的,因为它在启动时运行的控制组中留下了一些剩余的进程。有没有办法用一行左右的时间来做到这一点?

答案1

我找不到直接使用 pkill 的方法,但已经设法使用这个答案。该答案的关键在于您可以-在进程组 ID 之前使用它来终止它。

从它们复制并使用 pgrep 使其完整,我们得到:

  • kill -- -$(ps -o pgid= $(pgrep -f 'name') | grep -o '[0-9]*')(如果有多个匹配的进程可能不起作用)

您可以将其更改---TERM(相同内容),或者按照我的用法,我习惯-INT发送中断(Ctrl-C):

  • kill -TERM -$(ps -o pgid= $(pgrep -f 'name') | grep -o '[0-9]*')(同上)
  • kill -INT -$(ps -o pgid= $(pgrep -f 'name') | grep -o '[0-9]*')

我在调查过程中发现 PGID 和 PID 是相同的,并且找到了以下解释这里

当只输入一个命令时,PGID 与 PID 相同。PGID 可以被认为是系统范围的标识符。如果使用管道一次输入多个命令,则会启动多个进程,每个进程都有自己的 PID。但是,这些进程都具有相同的 PGID 和 shell 作业标识符。PGID 与管道中第一个进程的 PID 相同。

因此,在很多情况下,您可以放弃查找 PGID。我设法拼凑了以下命令:

  • kill -INT -$(pgrep -f 'name')(如果没有进程则会产生错误,只对 1 个进程有效)
  • pgrep -f 'name' | head -n 1 | xargs printf -- '-%s\n' | xargs kill -SIGINT --(如果没有进程则不会产生错误,可以处理多个匹配,但这些匹配可能是子项,因此会导致错误)

相关内容