假设我有一千个或更多正在运行的任何进程(例如,vi
)的实例。如何一击/一行命令/一个命令将它们全部杀死?
答案1
老好人怎么了
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
有一些方法可以提高效率,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
和其他变化,但在基本层面上,它总是对我有用。
答案2
使用killall,
killall vi
这将杀死所有名为“vi”的命令
您还可以添加一个信号,例如 SIGKILL
killall -9 vi
答案3
pkill
这是我推荐的,如果有的话(Linux,自由BSD,网络BSD,开放BSD,索拉里斯)。您可以通过命令名称、完整命令行或其他条件来指定进程。例如,pkill vi
杀死命令名包含子字符串 的所有程序vi
。要仅终止调用的进程vi
,请使用pkill -x vi
.要仅终止vi
最后一个参数以 结尾的进程.conf
,请使用pkill -fx 'vi.*\.conf'
。
pkill
要查看将向其发送信号的 PID 列表,请使用pgrep
,它具有完全相同的语法,只是它不接受信号名称或编号。要查看有关这些进程的更多信息,请运行
ps -p "$(pgrep …)"
在 Linux 下,您需要ps -p $(pgrep -d, …)
改为(这是一个错误:Linuxps
不兼容 POSIX)。
识别要终止的进程的另一种常见方法是打开某个文件(可以是进程的可执行文件)的进程。您可以列出这些fuser
;用于fuser -k
向他们发送信号。例如,fuser -k /usr/bin/find
杀死 的所有正在运行的实例find
。
如果有一个失控的进程不断分叉,您可能需要杀死整个进程进程组立刻。进程组由其领导者的负数来标识,领导者是组中所有进程的祖先进程。要查看进程所属的进程组,请运行ps -o pgid
(加上用于选择要显示的进程的任何选项)。如果您确定要杀死进程组领导者 1234 及其所有子进程,请运行kill -1234
或kill -HUP -1234
或任何其他信号。
如果您找不到更好的方法,请使用适当的选项来列出所有进程并使用其他文本过滤命令ps
对其进行过滤。grep
请注意不要意外匹配其他正在运行具有相似名称或包含该名称的参数的命令的进程。例如:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
请记住,您的grep
或awk
命令本身可能会在输出中列出ps
(ps
并且过滤命令是并行启动的,因此它是否会显示取决于时间)。如果命令参数包含在ps
输出中,这一点尤其重要。
答案4
pkill
这里很好。您可以给它很多参数来完善模式。