首先三个命令都是用于杀掉进程的,不过kill是杀掉单个进程,killall是杀掉所有同名进程,pkill是杀掉一类进程或者某个用户的所有进程。
kill 命令的用途
kill 命令很容易让人产生误解,以为它仅仅就是用来杀死进程的。我们来看一下 man page 对它的解释:kill - send a signal to a process.从官方的解释不难看出,kill 是向进程发送信号的命令。当然我们可以向进程发送一个终止运行的信号,此时的 kill 命令才是名至实归。事实上如果我们不给 kill 命令传递信号参数,它默认传递终止进程运行的信号给进程!这是 kill 命令最主要的用法,也是本文要介绍的内容。
一般情况下,终止一个前台进程使用 Ctrl + C 就可以了。对于一个后台进程就得用 kill 命令来终止。我们会先使用 ps、top 等命令获得进程的 PID,然后使用 kill 命令来杀掉该进程。
kill 命令格式
使用kill -l命令列出所有可用的信号。
最常被使用的信号是1/9/15:
1(HUP):重新加载进程。 9 (KILL):杀死进程。 15(TERM):完美地停止一个进程。 kill pid //同下-15默认的安全停止进程 kill -15 pid // kill -9 pid //彻底杀死进程
使用信号 15 是安全的,而信号 9 则是处理异常进程的最后手段,这样结束掉的进程不会进行资源的清理工作,所以如果你用它来终结掉 vim 的进程,就会发现临时文件 *.swp 没有被删除。
Linux killall (kill processes by name)用于杀死进程,与 kill 不同的是killall 会杀死指定名字的所有进程。kill 命令杀死指定进程 PID,需要配合 ps 使用,而 killall 直接对进程对名字进行操作,更加方便。
killall -9 mysql //结束所有的 mysql 进程
pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,除此之外,pkill 还有一个更重要的功能,即按照终端号来踢出用户登录。
pkill mysql //结束 mysql 进程 pkill -u mark,danny //结束mark,danny用户的所有进程 w //#使用w命令查询本机已经登录的用户 pkill -9 -t pts/1 //#强制杀死从pts/1虚拟终端登陆的进程
如果能看懂下面一系列命令,那么killall 、kill 、pkill三个命令之间的区别你也就了然于胸了。
1、pgrep命令:专门显示进程的进程号,相当于:
ps -aux | grep 进程名 | grep -v grep| awk '{print $2}'
2、pidof命令:pid of xx进程,显示进程的进程号,同上pgrep。
3、组合命令的使用:
pgrep mysql | xargs kill -s 9 ps -ef | grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9 kill -s 9 `pgrep mysql`
看到上面这三条命令的转换想到了什么吗,联想下pkill命令:pkill=pgrep+kill。
pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 “-s 9”,结果每次运行都无法终止进程。
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。