如何杀死多个进程


21

找到要杀死的进程的PID的用法:

pgrep <process command>

然后,我使用kill命令杀死由...返回的PID pgrep <process command>

kill <PID>

可以将这些命令组合为一个命令,这样可以杀死PID或返回的PID pgrep <process command>吗?还是有一种方法可以通过命令名杀死多个进程?

就像是 : kill(pgrep <name of process>)


3
你尝试了pkill吗?或者,您可能要使用xargs
MatthewRock '16

1
请注意,手册页也适用于此类内容。通常,他们不仅会告诉您如何使用该命令,还会告诉您有关的命令。在这种情况下,pgrep手册页会在pkill所有位置提及该内容(因为这两个命令来自同一软件包)。
Patrick

Answers:


27

您可以使用pkill:

pkill httpd

您可能还想使用流程替换(尽管不清楚):

kill $(pgrep command)

您可能要使用xargs

pgrep command | xargs kill

4
我在回答中做了类似的事情,并向我指出我引入了比赛条件。在pgrep和之间的调用之间可能会使进程ID无效kill。只需使用pkill
库沙兰丹

3
@Kusalananda在pkill获取进程列表和实际发送信号之间也可能发生同样的事情,在这种情况下很难看到。
hobbs

1
我本想尝试编写一个答案,kill $(ps|head -1)使之回避诸如避免出现竞争状况之类的问题……但是确实没有办法避免这种情况。该过程可能在管道中的任何点终止。
Ross Presser

请小心使用pkill,因为某些程序可能正在运行多个实例,并且您可能不想杀死所有实例。只要在运行pgrep和pkill(竞赛)之间没有启动另一个pgrep,则首先运行它会有所帮助。

1
即使是C程序也无法避免竞争情况,窗口会更小。真正做到原子化的唯一方法是添加一个按名称杀死进程的系统调用。但是进程ID通常不会很快被重用,因此实际上不存在这种危险。
Barmar

17

您也可以使用killall,例如

killall firefox

发送SIGTERM到所有firefox进程。


8
请注意,这killall在不同的Unix系统上具有不同的含义-如果您使用的是非Linux系统,请务必检查文档。
Random832 '16

killall -KILL firefox会觉得很有意义
管道

的不可移植性killall是为什么我从不使用它。killall例如,在solaris盒子上运行会带来灾难性的后果。
Patrick


0

您可以使用数组杀死多个进程。在这种情况下,您可以指定选项$ip$hostname或者类似的东西。

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.