kill,killall,pgrep,pkill,top

常见的进程信号

信号代号 信号名称 说 明
1 SIGHUP 该信号让进程立即关闭.然后重新读取配置文件之后重启
2 SIGINT 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键
8 SIGFPE 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误
9 SIGKILL 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程
14 SIGALRM 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号
15 SIGTERM 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9
18 SIGCONT 该信号可以让暂停的进程恢复执行。本信号不能被阻断
19 SIGSTOP 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断

其中最重要的就是 “1”、”9”、”15”这三个信号。

kill 命令

kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。

kill 命令的基本格式如下:
[root@localhost ~]# kill [信号] [PID|Job ID]
kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID和Job ID,而不能识别进程名。

给进程发送信号
[root@localhost ~]# kill -l //列出所有支持的信号
编号 信号名
1) SIGHUP 重新加载配置 PID不变
2) SIGINT 键盘中断^C
3) SIGQUIT 键盘退出
9) SIGKILL 强制终止
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 停止
20)SIGTSTP 暂停^Z

重启restart(stop,start) 重新加载(reload, reconfigure)
重启PID改变 ,重载PID不变
修改配置文件后可使用重启或重载的方式更新配置文件,建议能重载不要重启

1、 给vsftpd进程发送信号1,15

1) SIGHUP 重新加载配置 PID不变
15) SIGTERM 终止(正常结束),缺省信号

vsftpd 信号测试
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# systemctl start vsftpd //vsftpd 服务开启

[root@localhost ~]# ps aux |grep vsftpd
root 9160 0.0 0.0 52580 904 ? Ss 21:54 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

[root@localhost ~]# kill -1 9160 //发送重启信号 例如vsftpd的配置文件发生改变,希望重新加载
root 9160 0.0 0.0 52580 904 ? Ss 21:54 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

[root@localhost ~]# kill 9160 //发送停止信号 , vsftpd服务有停止的脚本 systemctl stop vsftpd
[root@localhost ~]# ps aux |grep vsftpd

crond信号测试

// 1
[root@bogon ~]# ps aux | grep crond
root 661 0.0 0.1 126384 1644 ? Ss 14:11 0:00 /usr/sbin/crond -n
root 1474 0.0 0.0 112824 980 pts/0 R+ 14:33 0:00 grep —color=auto crond
[root@bogon ~]# kill -1 661
[root@bogon ~]# ps aux | grep crond
root 661 0.0 0.1 126384 1644 ? Ss 14:11 0:00 /usr/sbin/crond -n
root 1476 0.0 0.0 112824 980 pts/0 R+ 14:34 0:00 grep —color=auto crond
// 15
[root@bogon ~]# kill 661
[root@bogon ~]# ps aux | grep crond
root 1478 0.0 0.0 112824 980 pts/0 R+ 14:34 0:00 grep —color=auto crond
[root@bogon ~]# systemctl start crond.service
[root@bogon ~]# ps aux | grep crond
root 1519 17.5 0.1 126388 1644 ? Ss 14:34 0:00 /usr/sbin/crond -n
root 1521 0.0 0.0 112824 980 pts/0 S+ 14:34 0:00 grep —color=auto crond

2、信号测试9,15
创建两个文件,用两个终端,都用vim打开,一个打开file1,一个打开file2 ,开启第三个终端,在第三个终端上给打开的两个进程发宋不同的信号

9) SIGKILL 强制终止
15) SIGTERM 终止(正常结束),缺省信号

终端1
[root@localhost ~]# touch file1 file2
[root@localhost ~]# tty
/dev/pts/1
[root@localhost ~]# vim file1
终端2
[root@localhost ~]# tty
/dev/pts/2
[root@localhost ~]# vim file2
终端3
[root@localhost ~]# ps aux |grep vim
root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1
root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2

[root@localhost ~]# kill 4362
[root@localhost ~]# kill -9 4363

killall 命令

killall 命令的基本格式如下:
[root@localhost ~]# killall [选项] [信号] 进程名
注意,此命令的信号类型同 kill 命令一样,因此这里不再赘述,此命令常用的选项有如下 2 个:

  • -i:交互式,询问是否要杀死某个进程;
  • -I:忽略进程名的大小写;

killall
[root@localhost ~]# killall vim //给所有vim进程发送信号
[root@localhost ~]# killall httpd

3、信号测试18,19
18) SIGCONT 继续
19) SIGSTOP 停止

[root@localhost ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd

[root@localhost ~]# kill -STOP 5571 // kill 19 5571
[root@localhost ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ts 09:35 0:00 /usr/sbin/sshd

[root@localhost ~]# kill -cont 5571 // kill 18 5571
[root@localhost ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd

pkill 命令 / pgrep命令

当作于管理进程时,pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,该命令的基本格式如下:
[root@localhost ~]# pkill [信号] 进程名
表 1 罗列了此命令常用的信号及其含义。

表 1 pkill 命令常用信号及其含义

信号编号 信号名 含义
0 EXIT 程序退出时收到该信息。
1 HUP 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。
2 INT 表示结束进程,但并不是强制性的,常用的 “Ctrl+C” 组合键发出就是一个 kill -2 的信号。
3 QUIT 退出。
9 KILL 杀死进程,即强制结束进程。
11 SEGV 段错误。
15 TERM 正常结束进程,是 kill 命令的默认信号。


命令概述

pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。

02. 命令格式

  1. 用法:pgrep [options] <pattern>

pkill命令踢出登陆用户

除此之外,pkill 还有一个更重要的功能,即按照终端号来踢出用户登录,此时的 pkill 命令的基本格式如下:
[root@localhost ~]# pkill [-t 终端号] 进程名
[-t 终端号] 选项用于按照终端号踢出用户;

学习 killall 命令时,不知道大家发现没有,通过 killall 命令杀死 sshd 进程的方式来踢出用户,非常容易误杀死进程,要么会把 sshd 服务杀死,要么会把自己的登录终端杀死。

所以,不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会,

4、踢出一个从远程登录到本机的用户
[root@localhost ~]# pkill —help
pkill: invalid option — ‘-‘
Usage: pkill [-SIGNAL] [-fvx] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]
[root@localhost ~]# pkill -u alice

[root@localhost ~]# w
15:46:44 up 2:19, 4 users, load average: 0.17, 0.12, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 :0 21:32 ? 4:22 4:22 /usr/bin/Xorg :
root pts/0 :0.0 15:46 0.00s 0.00s 0.00s w
root pts/3 172.16.8.100 15:46 2.00s 0.01s 0.00s sleep 50000

[root@localhost ~]# pkill -t pts/1 //给终端pts/1上的所有进程发送信号 终止pts/1上的所有进程
[root@localhost ~]# pkill -9 -t pts/1 // 终止pts/1上的所有进程 并结束pts/1