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 --
(如果没有进程则不会产生错误,可以处理多个匹配,但这些匹配可能是子项,因此会导致错误)