使用一个命令杀死多个正在运行的进程实例

The*_*ght 97 process kill

假设我有任何进程(例如,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)

和其他变化,但在基本层面上,它总是对我有用。

  • @TheDarkKnight 这种方法的问题在于,你最终杀死的往往比你预期的要多。编写可靠的“一些搜索”很棘手。在 Linux 下,[使用 pkill](http://unix.stackexchange.com/a/50621),它处理了大部分的微妙之处。 (5认同)
  • 投了票,只知道第一个变化。第二个看起来更有效率,谢谢。 (2认同)

dai*_*isy 42

使用killall,

killall vi

这将杀死所有名为“vi”的命令

您也可以添加一个信号,例如 SIGKILL

killall -9 vi

  • 请注意,这仅适用于 Linux 和 BSD。在 Solaris 和其他一些系统上,`killall` 的作用正如其名……它杀死了 init 进程。 (13认同)
  • 在 AIX 上,它“取消您启动的所有进程,除了那些产生 killall 进程的进程”。 (2认同)

Gil*_*il' 36

pkill是我推荐的,如果它可用(LinuxFreeBSDNetBSDOpenBSDSolaris)。您可以通过命令名称、完整命令行或其他条件来指定进程。例如,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 -1234kill -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)


Nil*_*ils 8

pkill这里很不错。你可以给它很多参数来优化模式。