前言
常見面試題:如何用一句 linux 指令,查找到指定名稱的進程並殺掉
常用的殺進程的三個指令:killall 、kill 、pkill
殺進程幾種方式
killall命令用於殺死指定名字的進程(kill processes by name)
killall [參數] [進程名]
kill命令殺死指定進程PID的進程
kill [參數] [進程id]
pkill 和killall差不多,也是用於殺掉指定名稱的進程
pkill [參數] [進程名]
killall
先用ps查找出需要殺掉的進程
ps -ef |grep 進程名稱
比如我想殺掉 httpd 的進程
[root@VM_0_2_centos opt]# ps -ef | grep httpd
root 21982 21885 0 21:06 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 21983 21982 0 21:06 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 21984 21982 0 21:06 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 21999 21982 0 21:06 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
root 22321 19229 0 21:06 pts/0 00:00:00 grep --color=auto httpd
查找出來的進程很多,如果想一次性殺掉,可以用killall
killall -9 httpd
再去查看進程就被殺掉了
[root@VM_0_2_centos opt]# killall -9 httpd
[root@VM_0_2_centos opt]# ps -ef | grep httpd
root 22781 19229 0 21:08 pts/0 00:00:00 grep --color=auto httpd
pkill
pkill 和 killall用法差不多,也是根據進程名稱來殺掉全部
pkill -9 httpd
[root@VM_0_2_centos opt]# ps -ef | grep httpd
root 23284 23216 0 21:09 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 23290 23284 0 21:09 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 23292 23284 0 21:09 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 23294 23284 3 21:09 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
root 23377 19229 0 21:09 pts/0 00:00:00 grep --color=auto httpd
[root@VM_0_2_centos opt]# pkill -9 httpd
[root@VM_0_2_centos opt]# ps -ef | grep httpd
root 23680 19229 0 21:09 pts/0 00:00:00 grep --color=auto httpd
kill
kill 是用於殺掉單個進程,根據進程的PID, ps -ef
查出來的第二列就是PID
[root@VM_0_2_centos opt]# ps -ef | grep httpd
root 24431 24361 0 21:11 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 24432 24431 0 21:11 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 24433 24431 0 21:11 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 24445 24431 0 21:11 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
root 24519 19229 0 21:11 pts/0 00:00:00 grep --color=auto httpd
[root@VM_0_2_centos opt]# kill -9 24431
這里 kill 是殺掉單個進程PID,如果想殺掉全部的,需配合 awk 命令
ps -ef | grep httpd | awk '{print $2}' | xargs kill -9
[root@VM_0_2_centos opt]# ps -ef | grep httpd
root 26267 26194 0 21:15 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 26269 26267 0 21:15 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 26270 26267 0 21:15 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
65534 26273 26267 0 21:15 ? 00:00:00 /opt/zbox/run/apache/httpd -k start
root 26358 19229 0 21:15 pts/0 00:00:00 grep --color=auto httpd
[root@VM_0_2_centos opt]# ps -ef | grep httpd | awk '{print $2}' | xargs kill -9
kill: sending signal to 26652 failed: No such process
[root@VM_0_2_centos opt]# ps -ef | grep httpd
root 26664 19229 0 21:15 pts/0 00:00:00 grep --color=auto httpd
[root@VM_0_2_centos opt]#
參數說明
- ps -ef 是linux 里查看所有進程的命令。
- grep httpd 所有含有關鍵字"httpd"的進程
- awk '{print $2}' 輸出第二列的PID
- xargs 是將獲取到的多個PID標准輸入轉為命令行參數。
- kill -9 殺掉xargs獲取到的對應的PID
如果能准確知道進程名稱,可以直接用killall 和pkill ,如果是模糊匹配進程名稱,就用最后一個
ps -ef | grep 進程名稱 | awk '{print $2}' | xargs kill -9