Linux提供了许多工具来管理系统中的进程。你可以用它们来创建、克隆、甚至销毁进程(create, clone, destroy)。有时你可能需要在Linux中按名称杀死所有进程。在Linux中,有多种方法可以做到这一点。你可以使用pkill、pgrep、pidof和killall中的任何一个函数。在这篇文章中,我们将详细介绍它们。现在的例子都是在Ubuntu中运行的。
1, 使用pkill命令
pkill命令允许你直接按名称杀死进程。例如,以下是杀死所有以apache为名的进程的命令:
$ sudo pkill apache
pkill命令使用格式:
pkill [options]
注意这个参数是一个pattern,是一个正则表达式。如果使用apache,那所有名字中包含apache的进程都会被杀掉。
如果命令是:
$ sudo pkill apache$
那就是杀掉所有名字结尾是apache的进程。
需要注意的是这里的进程命不包括选项部分,比如在Ubuntu系统里使用ps命令查看到一个进程:
/usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
这个进程的名字就是前面的路径加进程名,而后面的长长选项都不是进程的名字。
可以直接使用ps -ef命令查看全部进程,里面包含完整的进程命。比如在当前路径下有个程序test,运行后显示进程名:
$ ./test
$ pwd
/home/ubuntu/Workspace/01_pkill
$ /home/ubuntu/Workspace/01_pkill/test
$ ps -ef | grep test$
vm 2662 1628 99 09:12 pts/0 00:19:37 /home/ubuntu/Workspace/01_pkill/test
vm 3185 1628 99 09:29 pts/0 00:02:43 ./test
2,使用pgrep
pgrep命令根据输入的搜索字符串返回一个PID的列表。所以你也可以使用pgrep命令按其名称搜索所有的命令,并使用kill命令来杀死Linux中的这些进程。
下面的命令将列出所有名字为apache的进程的PIDs:
$ pgrep apache
6123
6230
可以加上kill命令,杀掉搜索名字得到的PID:
$ kill -9 `pgrep apache`
这里的kill -9是强制杀死某个进程。pgrep命令输出所有名字包含apache的进程PID,作为kill命令的输入,可以一次杀死多个进程。
pgrep的用法:
pgrep [options]
所以参数也是一个正则表达式,和pkill一样。
3,使用pidof
类似的,使用pidof命令,也可以根据进程名获取PID列表。
$ pidof apache
6123 6230
然后就可以使用kill命令来根据PID杀死进程:
$ kill -9 `pidof apache`
pidof命令的用法:
pidof [options] program [program...]
可以看到可以后面接多个参数,一次返回多个进程名的ID。
pidof和pgrep的区别是后面的参数需要是完全匹配的进程名。要么是和程序名一样,要么是和完整路径名加程序名一样。
4,使用killall
使用killall命令根据名字直接杀死进程:
$ killall -9 apache
这个命令和pidof类似,给出的名字要完全匹配,要么和程序名一样,要么是和完整路径名加程序名一样。
5,其他方法
如果不使用上面这些工具,而杀掉某个进程的原始方法,恐怕是使用ps命令显示出所有进程,按名字找到进程信息所在行的PID,再使用kill命令。
或者使用ps | grep procName,来快速定位进程信息,找出PID,再执行kill命令。这样使用没有上面的方法快。
$ ps | grep test
3450 pts/0 00:00:03 test
$ kill 3450
[1]+ Terminated ./test
总结
按照是模式匹配还是完全匹配名称,将pgrep/pkill和pidof/killall区分开来。
按照取得PID信息和直接执行kill操作,将pkill/killall和pgrep/pidof区分开来。
参考:
How to Kill Process by Name in Linux - Ubiq BI