【Linux】进程管理之kill、killall、pkill
一、kill 命令
Linux 中的 kill 命令用来终止指定的进程的运行,是 Linux 下进程管理的常用命令。通常,终止一个前台进程可以使用 Ctrl+C
键,但是,对于一个后台进程就须用 kill 命令来终止,那就需要先使用 ps、pidof、pstree、top等工具获取进程 PID,然后使用 kill 命令来杀掉该进程。kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。其基本语法命令如下:
kill [参数] [进程id]
参数 | 说明 | |
---|---|---|
-l | –list | 如果-l 后面不加任何参数,那就就代表列出所有的信号名字 |
-a | 当处理当前进程时,不限制命令名和进程号的对应关系 | |
-p | 指定kill 命令只打印相关进程的进程号,而不发送任何信号 | |
-s | 指定发送信号 | |
-u | 指定用户 | |
-V | –version | 版本信息 |
-h | –help | 帮助文档 |
kill 命令是通过向进程发送指定的信号来结束相应进程的,根据不同的信号,kill 命令可以完成不同的操作。在默认情况下,采用编号为15的TERM信号,TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的 kill 信号,强行“杀掉”该进程。
参数 | 说明 | |
---|---|---|
HUP | 1 | 终端断线 |
INT | 2 | 中断,同 Ctrl + C |
QUIT | 3 | 退出 |
TERM | 15 | 终止 |
KILL | 9 | 强制终止 |
CONT | 18 | 继续 |
STOP | 19 | 暂停 |
Linux 中每个进程的进程的PID是唯一的,可以用于区分不同的进程。kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。我们举几个例子来说明一下 kill 命令:
# 查询java服务的PID
$ pidof java
118754
# 将PID所代表的进程终止掉
$ kill 118754
# 有时系统会提示进程无法被终止,此时可以加参数-9,表示最高级别地强制杀死进程
$ kill -9 118754
注意:
- kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。
- 当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。
- 应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启 动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。
二、killall 命令
Linux 系统中的 killall 命令用于杀死指定名字的进程,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死对应的进程。我们可以使用 kill 命令杀死指定进程 PID 的进程,如果要找到需要杀死的进程,还需要在之前使用 ps 等命令,再配合 grep 来查找进程,而 killall 把这两个过程合二为一,是一个很好用的命令。其基本语法命令如下:
killall [参数] [进程名]
参数 | 说明 | |
---|---|---|
-Z | –context | 只杀死拥有scontext 的进程 |
-e | –exact | 进程需要和名字完全相符 |
-I | –ignore-case | 忽略进程名的大小写 |
-g | –process-group | 杀死进程组而不是进程 |
-i | –interactive | 交互模式,询问是否要杀死某个进程 |
-l | –list | 列出所有的已知信号名称 |
-q | –quite | 进程没有结束时,不输出任何信息 |
-v | –verbose | 报告信号是否成功发送 |
-u | –user | 显示详细执行过程 |
-w | –wait | 等待所有的进程都结束 |
–help | 显示帮助信息 | |
-V | –version | 显示版本显示 |
# 杀死所有同名进程
killall nginx
# 强制杀死所有bash进程
killall -9 bash
# 向进程发送指定信号
killall -TERM ngixn
# 向进程发送指定KILL信号
killall -KILL nginx
默认没有需要yum安装
yum -y install psmisc
三、pkill 命令
pkill 命令和 killall 命令的用法相同,都是通过进程名杀死进程。与 kill 不同的是它会杀死指定名字的所有进程,类似于 killall 命令。kill 命令杀死指定进程 PID,需要配合 ps 使用,而 pkill 直接对进程对名字进行操作,更加方便。
pkill [选项] 进程名称
参数 | 说明 |
---|---|
-o | 仅向找到的最小(起始)进程号发送信 |
-n | 仅向找到的最大(结束)进程号发送信号 |
-P | 指定父进程号发送信号 |
-g | 指定进程组 |
-t | 指定开启进程的终端 |
# 结束 mysql 进程
pkill mysql
# 结束mark,danny用户的所有进程
pkill -u mark,danny
# 使用w命令查询本机已经登录的用户
w
# 强制杀死 mysql 进程
pkill -9 -t mysql
四、拓展命令
如果能看懂下面一系列命令,那么killall 、kill 、pkill三个命令之间的区别你也就了然于胸了。
-
pgrep命令:专门显示进程的进程号,相当于:
ps -aux | grep 进程名 | grep -v grep| awk '{print $2}'
-
pidof命令:pid of xx进程,显示进程的进程号,同上pgrep。
-
组合命令的使用:
pgrep mysql | xargs kill -s 9 ps -ef | grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9 kill -s 9 `pgrep mysql`