假设我有任何进程(例如,vi)的一千个或更多实例正在运行。我如何在一次射击/一行命令/一个命令中将它们全部杀死?
Eig*_*ony 133
老好人有什么不好,
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Run Code Online (Sandbox Code Playgroud)
有一些方法可以提高效率,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
Run Code Online (Sandbox Code Playgroud)
和其他变化,但在基本层面上,它总是对我有用。
dai*_*isy 42
使用killall,
killall vi
这将杀死所有名为“vi”的命令
您也可以添加一个信号,例如 SIGKILL
killall -9 vi
Gil*_*il' 36
pkill是我推荐的,如果它可用(Linux,FreeBSD,NetBSD,OpenBSD,Solaris)。您可以通过命令名称、完整命令行或其他条件来指定进程。例如,pkill vi杀死所有命令名称包含子字符串的程序vi。要仅终止被调用的进程vi,请使用pkill -x vi. 要仅vi终止以 结尾的最后一个参数调用的进程.conf,请使用pkill -fx 'vi.*\.conf'.
要查看pkill将信号发送到的 PID 列表,请使用pgrep,它具有完全相同的语法,但不接受信号名称或编号。要查看有关这些进程的更多信息,请运行
ps -p "$(pgrep …)"
Run Code Online (Sandbox Code Playgroud)
在 Linux 下,您需要ps -p $(pgrep -d, …)改为(这是一个错误:Linuxps不符合 POSIX 标准)。
识别要杀死的进程的另一种常用方法是打开某个文件(可以是进程的可执行文件)的进程。你可以列出这些fuser; 用fuser -k向他们发送的信号。例如,fuser -k /usr/bin/find杀死find.
如果有一个失控的进程不断分叉,您可能需要立即杀死整个进程组。一个进程组由它的leader的否定标识,它是组中所有进程的祖先进程。要查看进程所属的进程组,请运行ps -o pgid(加上任何选项以选择要显示的进程)。如果您确定要终止的进程组长1234和它的所有孩子,跑步kill -1234或kill -HUP -1234或其他任何信号。
如果找不到更好的方法,请使用ps适当的选项来列出所有进程并使用grep或其他一些文本过滤命令对其进行过滤。注意不要意外匹配其他碰巧正在运行具有相似名称的命令的进程,或者与包含该名称的参数匹配。例如:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Run Code Online (Sandbox Code Playgroud)
请记住,您的greporawk命令本身可能会在ps输出中列出(ps并且过滤命令是并行启动的,因此它是否会出现取决于时间)。如果命令参数包含在ps输出中,这一点尤其重要。
小智 10
最简单的方法是首先检查您是否获得了正确的进程 ID:
pgrep -f [part_of_a_command]
Run Code Online (Sandbox Code Playgroud)
如果结果如预期。与:
pkill -f [part_of_a_command]
Run Code Online (Sandbox Code Playgroud)