我正在使用以下代码来终止某个进程的所有 PID,但它没有按预期工作。
pgrep -f <processname>
kill -9 $(pgrep -f <processname>)
当有多个 PID 时,上面这一行会抛出错误,指出:
争论太多。
答案1
killall <processname>
killall
允许通过名称或正则表达式(-r
)和一些用于匹配正确进程组的其他选项来终止所有进程。SIGTERM
选项可用(killall -9 name
)。
答案2
这就是pkill
目的:
pkill -f <processname>
或者,如果你必须使用-9
:
pkill -9 -f <processname>
为了完成你正在尝试的事情,你需要通过输出pgrep
命令的kill
。相反,你传递的是多变的命名$pgrep
,当然,没有任何价值。 您可以在启用后运行以下命令来查看set -x
:
$ set -x
$ kill -9 $pgrep -f emacs
+ kill -9 -f emacs
sh: kill: -f: arguments must be process or job IDs
sh: kill: emacs: arguments must be process or job IDs
(运行set +x
以禁用调试信息)
如上所示,$pgrep
由于它是未定义变量,因此被删除,因此为空,并且和-f
被emacs
作为参数传递给kill
。您想要做的是使用命令替换将一个命令的输出作为另一个命令的输入:
kill $(pgrep -f emacs)
最后,kill -9 foo
除非绝对必要且kill foo
单独使用无效,否则请避免使用。使用-9
可能非常具有破坏性,并且不会让进程正常退出。