kill 命令,一眼看上去就让人觉得是"杀掉"的含义,但其实kill命令是用来发送信号的,我们先来看一下信号的种类。

信号的种类

信号:即一个进程发送给另一个进程的消息。
Linux系统中有十几种信号,每一种信号都被分配了一个数字和一个名字。常用的信号如下:
kill -l 或 trap -l #查看系统中全部的信号命令

[root@Centos8 shell_scripy]# kill -l1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

可以看到信号的种类有很多,我们最常用的就是 2) SIGINT 键盘中断、 9) SIGKILL杀死进程、15) SIGTERM终止进程,程序自行结束;2信号就是我们经常用来中断前台进程的的Ctrl+C, SIGINT只能被前台进程捕获得到,所以SIGINT称为键盘中断;9信号表示无条件杀死,15信号表示终止进程,程序自行结束,15信号也是kill命令没有指定信号时的默认发送的信号;

kill命令

kill命令可以发送各种信号给某个进程,不要因为kill的名字就认为它只能杀死进程。

kill命令格式:kill [ -s sigspec | -n signum | -sigapec ][ pid | jobspec]

说明:通过sigspec或 signum指定要发送的信号,sigspec既可以是任意大小写信号的名字(有无SIG前缀都可以),也可以是给信号分配的数字,而signum只能是数字。pid为进程的进程号。(可用ps -fC 进程名或jobs -l,来查看进程的PID)
kill命令会把指定的信号发送给进程号为pid的进程或者发送给作业号为jobspec的进程。如果没有给kill命令指定任何信号,kill命令就默认发送SIGTERM信号,收到SIGTERM命令的进程就会结束运行,这就是普通情况下使用kill命令杀死进程的过程,再次提醒:不要因为kill的名字就认为它只能杀死进程,实际上kill命令可以发送各种信号给某个进程。
示例:杀死PID为4269的后台进程:
①kill -n 15 4211 #指定信号的数字号为15并发送给PID为4211的进程
②kill -s HUP 4269 或 kill-s sighup 4269 或 kill -n 1 4269 #3者是等价的
③kill 4215 #不指定信号,则发送默认的SIGTERM信号
有时候我们执行一个脚本时可能会产生很多临时文件,当然我们可以在脚本的最后面写命令来删除这些不需要的临时文件,但当我们的脚本程序执行中间被Ctrl+c或kill的时候,因为可能程序已经产生了临时文件但在执行删除命令前就被终止了,所以此时临时文件并没有被删除。这时我们就可以用信号这种机制来自动解决这个问题。即需要在脚本中自定义一个收到这些终止信号时执行具体操作的回调函数。
trap命令语法:trap commands signal1 signal2 signal3…
说明:其中commands 可以是一系列的命令或一个函数名,在它的后面是一系列信号的数字或信号名,这些信号的任意一个发送到shell脚本,或者说这些信号的任意一个被脚本所捕获时,所指定的命令或函数就会被执行。
其实,trap的commands 命令可以被省略,当没有指定commands 命令时,shell脚本接收到这些信号时就会执行它们的默认值,每一个信号都有一个默认值。
注意:当shell脚本进程接收到一个信号时,它会暂停当前的工作并查看是哪一个信号,然后检查信号是否被忽略,如果没有被忽略就执行commands 命令,如果没有commands 命令就执行信号的默认行为,当执行完commands 命令相关的操作后,如果没有exit退出脚本的命令,则它就返回到收到信号的地方继续执行下一条指令。所以,如果需要在接收到信号时就退出,就需要在commands 命令中写一条exit命令。
虽然在kill-l或trap -l中找不到信号0这个信号,但这个信号时存在的,它是一个伪信号,对应于exit (无论exit后面是否有数字);也就是说,当程序执行到最后末尾程序即将退出或遇到exit即将退出时,就会触发伪信号0。利用这个特性,我们可以在脚本执行完毕时做一些善后懂得工作。如 trap show_goodbey 0。
屏蔽信号:当进程不想被中途某个信号打断时,我们可以指定trap操作为空或:来屏蔽这个信号的默认操作,(:号是bash的一个内建命令,它总是说明也不做并且返回0,因此用来表示一个空操作再合适不过了)如:trap ‘’1 15或trap :1 15
注意:依个人理解,信号的捕获应该是从接收到信号的地方其向上搜索,搜到相应的信号对应的trap命令后执行,所以如果此时前面还有n条对相同的信号处理的trap命令,则都不会被执行,只执行向上搜索找到的第一条相应的信号的trap命令,如果在接收到信号的地方下面也有相同信号的trap命令,也不会被执行。

注意:建议使用-15信号,因为这样父进程及其子进程都会释放资源后才终止,而9信息直接杀死进程太野蛮,可能会造成父进程被杀死了其子进程还在,这样造成了僵尸进程的存在,而僵尸进程会被1号进程托管。

演示示例:

使用9信号杀掉进程:
[root@Centos8 ~]# ps -ef | grep nginx      #查看nginx的进程号PID
root        2705       1  0 12:59 ?        00:00:00 nginx: master process nginx
nginx       2706    2705  0 12:59 ?        00:00:00 nginx: worker process
root        2708    1769  0 12:59 pts/0    00:00:00 grep --color=auto nginx[root@Centos8 ~]# kill -9 2705
[root@Centos8 ~]# ps -ef | grep nginx      #发现存在nginx的work进程,存在了僵尸进程,同时work进程因为其父进程死了会被1号进程托管了
nginx       2706       1  0 12:59 ?        00:00:00 nginx: worker process
root        2721    1769  0 13:00 pts/0    00:00:00 grep --color=auto nginx[root@Centos8 ~]# kill  -9 2706            #继续干掉work进程
[root@Centos8 ~]# ps -ef | grep nginx      #这样nginx进程已经全部都被干掉了
root        2773    1769  0 13:03 pts/0    00:00:00 grep --color=auto nginx使用15信号杀掉进程:
[root@Centos8 ~]# nginx
[root@Centos8 ~]# ps -ef | grep nginx
root        2864       1  0 13:10 ?        00:00:00 nginx: master process nginx
nginx       2865    2864  0 13:10 ?        00:00:00 nginx: worker process
root        2867    1769  0 13:10 pts/0    00:00:00 grep --color=auto nginx
[root@Centos8 ~]# kill -15 2864        #使用15信号杀掉master进程,全部的进程包括其子进程都被杀掉了
[root@Centos8 ~]# ps -ef | grep nginx
root        2869    1769  0 13:10 pts/0    00:00:00 grep --color=auto nginx

killall命令

如果我们已经知道我们想要杀死的那个进程的名字,我们能够利用 killall 命令发送同样的信号,那么该进程的所有父进程子进程都会收到信息,语法格式如下:

killall [信号] 进程名

演示示例:

[root@Centos8 ~]# nginx
[root@Centos8 ~]# ps -ef | grep nginx
root        2897       1  0 13:13 ?        00:00:00 nginx: master process nginx
nginx       2898    2897  0 13:13 ?        00:00:00 nginx: worker process
root        2900    1769  0 13:13 pts/0    00:00:00 grep --color=auto nginx
[root@Centos8 ~]# killall -15 nginx        #使用killall直接指定进程名称即可
[root@Centos8 ~]# ps -ef | grep nginx
root        2903    1769  0 13:13 pts/0    00:00:00 grep --color=auto nginx

pkill命令

pkill 命令与killall命令类似,也是通过进程名来发送信号,语法格式如下:

pkill [信号] 进程名

演示示例:

[root@iflytek ~]# pkill -15 nginx
[root@iflytek ~]# w                                                            #w命令查看当前登录的用户20:58:50 up  6:25,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
zhangsan pts/0    192.168.44.1     14:35    1:19m  0.08s  0.08s -bash       #我要踢除张三这个黑客
root     pts/1    192.168.44.1     20:26    2.00s  0.08s  0.00s w
root     pts/2    192.168.44.1     20:27   30:42   0.02s  0.02s -bash
[root@iflytek ~]# pkill -kill -t pts/0                                     #根据TTY来剔除黑客

kill、killall 、pkill 发送信号命令相关推荐

  1. linux进程被信号杀死,Linux 命令 - kill: 向进程发送信号

    kill 命令通常用来 "杀死"(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序.kill 命令准确地说并不是 "杀死" 进程,而是给进程发 ...

  2. Kill Killall pkill

    文章目录 Kill Killall pkill 1 kill 1.1 常用功能 1.2 命令格式 1.3 使用实例 1.3.1 列出所有信号名称 1.3.2 得到指定信号的数值 1.3.3 杀死进程 ...

  3. linux进程无条件终止,kill - 终止进程/发送信号

    Linux命令之kill - 终止进程/发送信号 用途说明 kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令.通常,我们在需要终止某 ...

  4. Linux进程管理(ps,pgrep,kill,killall,pkill,nohup,bg,fg)

    文章目录 Linux进程管理 什么是进程?什么是线程?二者的区别? Linux进程管理命令 ps命令 使用方法案例 ps带减号和不带减号的区别 查看进程树的命令pstree pgrep命令 kill命 ...

  5. kill killall pkill 的区别

    kill.pkill.killall 的作用都是终止一个进程或者正在运行的程序. kill.pkill.killall 的用法 kill 通常和grep 一起使用 常用使用方法 kill -9 + 进 ...

  6. 9.4-6 kill killall pkill

    kill:终止进程 能够终止你希望停止的进程. kill 命令的参数选项及说明 -l    列出全部的信号名称 -p    指定kill命令只打印相关进程的进程号,而不发送任何信号 -s    指定要 ...

  7. 【genius_platform软件平台开发】第六十八讲:linux系统驱动开发之-驱动程序发送信号给应用程序

    大家好,我是峰哥,今天给大家解说一下:驱动层发送信号给应用程序.在上一篇文章中,我讲过:应用层发送指令来控制驱动层的GPIO状态,[genius_platform软件平台开发]第六十七讲:linux系 ...

  8. killall 后面信号_killall 、kill 、pkill 命令区别

    killall 命令Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死 ...

  9. [Linux] killall 、kill 、pkill 命令详解

    killall 命令 Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀 ...

  10. linux 命令:grep、egrep、ngrep、kill、pkill、killall

    1.grep 帮助:grep --help 用法:grep [OPTION]...patterns[FILE]... 示例:grep -i 'hello world' menu.h main.c    ...

最新文章

  1. python EasyGui
  2. ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )
  3. 从数组里挑出仅仅出现一次的对象
  4. 获取数组中元素值为偶数的累加和与元素值为奇数的累加和,并计算他们之间的差值
  5. windows, 放方向键设置为vim格式,autohotkey-windows
  6. Java:键盘输入一个小数,输出其整数部分
  7. 根据实例详解Java中的反射机制
  8. 华侨大学计算机应用技术章亮,华侨大学学生综合素质测评成绩汇总表
  9. nvidia旧版驱动_NVIDIA显卡驱动曝出5个高危级别漏洞 请尽快升级最新版本
  10. Docker使用link建立容器之间的连接
  11. 本地运行 MAYA 帮助文档
  12. 观音菩萨是企业家和领导者的好榜样
  13. linux下制作mac os x,桌面应用|Ubuntu 14.04 下的MAC OS X 主题安装
  14. BugKu-CTF(杂项misc)--YST的小游戏/easy_python
  15. 手机端获取用户详细地理位置(腾讯地图/高德)
  16. VBA将金额数字转成中文大写
  17. 字节校园精选 66 道高频经典笔面试题(含多种思路)(上)
  18. Spring boot AML教程
  19. 网络基础知识学习笔记
  20. 拖延是一种病----你有么?

热门文章

  1. 论财务自由与【生活-工作】平衡
  2. xtrabackup备份原理
  3. ES6 Set结构和Map结构(上)
  4. Java 中extends与implements使用方法
  5. C#的百度地图开发(四)前端显示与定位
  6. spark sql 对接 HDFS
  7. mac m1搭建java opencv 环境(遇到的坑记录)
  8. java后端路由中转
  9. 并发编程常见面试题总结四
  10. 并发编程常见面试题总结一