Linux:pkill命令用法实例详解
在 Linux 中 kill 用于杀死一个指定进程,一般配合 ps 使用,而 pkill 会杀死指定名字的所有进程,类似于 killall 命令。
killall 是杀死所有进程,而 pkill 是按照进程名称杀死进程,可以达到杀死所有进程的目的,在 linux 中同名的进程是分主进程和子进程的。
一、语法
pkill [OPTIONS] <PATTERN>
<PATTERN>:被指定使用扩展正则表达式。
当不使用任何选项时,pkill发送15(TERM)信号给匹配名字的所有运行程序的 PIDS。例如,想要完美停止所有 firefox 进程,你需要运行:
# pkill -9 firefox
当最少有一个正在运行的进程匹配给出的名字时,这个命令返回0,否则,返回退出代码1。在 shell 脚本中,返回值很有用。
想要发送不同的信号给匹配进程,运行pkill命令加上--signal选项,再加上进程号或者进程名。另一种发送信号的方式就是,运行 pkill 加上使用-作为前缀的信号名字或者信号序号。信号可以通过三种不同的方式来指定:
- 使用一个信号序号(例如: -1)
- 使用 “SIG” 前缀 (例如: -SIGHUP)
- 不使用 “SIG” 前缀 (例如: -HUP)
例如,想要重新加载 Nginx 进程,你可以运行:
# pkill -HUP nginx
pkill 使用正则表达式来匹配进程名称。这是一个好办法,在发送信号之前,先使用pgrep命令来打印匹配进程。
如,列出所有名称中包含ssh的进程:
1039 sshd
2257 ssh-agent
6850 ssh
31279 ssh-agent
如果你想依照名字准确匹配进程,并发送信号给它:
# pkill '^ssh$'
符号^代表字符串开头,字符串$代表字符串结尾
默认情况下,pkill仅仅匹配进程名称。如果使用-f选项,这个命令将会匹配所有参数列表。如果命令中包含空格,将整个命令用引号括起来:
# pkill -9 -f "ping 8.8.8.8"
使用-u选项告诉pkill仅仅匹配给出用户所运行的进程。
# pkill -u mark
想要指定多个用户,在多个用户名之间添加逗号:
# pkill -u mark,danny
你可以混合使用选项和搜索样式。例如,发送KILL信号给所有由"mark"用户运行的,并且进程名包含"gnome"的所有进程,你需要输入:
# pkill -9 -u mark gnome
想要显示最老的或者最新的进程,使用-n或者-o选项。
例如,想要杀死最近启动的 screen:
# pkill -9 -n screen
二、实例
pkill命令踢出登陆用户
除此之外,pkill 还有一个更重要的功能,即按照终端号来踢出用户登录,此时的 pkill 命令的基本格式如下:
# pkill [-t 终端号] 进程名
[-t 终端号] 选项用于按照终端号踢出用户;
学习 killall 命令时,不知道大家发现没有,通过 killall 命令杀死 sshd 进程的方式来踢出用户,非常容易误杀死进程,要么会把 sshd 服务杀死,要么会把自己的登录终端杀死。
所以,不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会,如:
# w
#使用w命令查询本机已经登录的用户
20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyl - 19:47 18:52 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.09s 0.04s w
root pts/1 192.168.0.100 19:51 14:56 0.02s 0.02s -bash
#当前主机已经登录了三个root用户,一个是本地终端ttyl登录,另外两个是从192.168.0.100登陆的远程登录
# pkill -9 -t pts/1
#强制杀死从pts/1虚拟终端登陆的进程
# w
20:09:09 up 30 min, 2 users, load average: 0.00, 0.00,0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyl - 19:47 21:27 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.06s 0.00s w
#虚拟终端pts/1的登录进程已经被杀死了