目录索引

  • 一、背景
  • 二、解决方案
  • kill 命令
    • kill命令的格式是:
    • 那么,kill -9 和 kill -15到底有什么区别呢?该如何选择呢?
  • 三、过程问题记录
  • 四、过程问题解决方案
  • 五、心得
  • 六、后话
  • 七 参见:

一、背景

为什么正常的kill无法"杀掉"进程,而kill -9就可以?为什么kill -9会引发这一连串连锁反应?正常的kill执行时,JVM会如何处理的呢?

二、解决方案

要搞清楚这些问题,我们要先从kill命令说起。

kill 命令

我们都知道,想要在Linux中终止一个进程有两种方式,如果是前台进程可以使用Ctrl+C键进行终止;如果是后台进程,那么需要使用kill命令来终止。(其实Ctrl+C也是kill命令)

kill命令的格式是:

kill[参数][进程号]

如:

kill 21121

kill -9 21121
其中[参数]是可选的,进程号可以通过jps/ps/pidof/pstree/top等工具获取。

kill的命令参数有以下几种:

-l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a 当处理当前进程时,不限制命令名和进程号的对应关系
-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s 指定发送信号
-u 指定用户
通常情况下,我们使用的-l(信号)的时候比较多,如我们前文提到的kill -9中的9就是信号。

信号如果没有指定的话,默认会发出终止信号(15)。常用的信号如下:

HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

比较常用的就是强制终止信号:9和终止信号:15,另外,中断信号:2其实就是我们前文提到的Ctrl + C结束前台进程。

那么,kill -9 和 kill -15到底有什么区别呢?该如何选择呢?

kill -9 和 kill -15的区别
kill命令默认的信号就是15,首先来说一下这个默认的kill -15信号。

当使用kill -15时,系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该信号后,具体要如何处理是自己可以决定的。这时候,应用程序可以选择:1、立即停止程序
2、释放响应资源后停止程序
3、忽略该信号,继续执行程序
因为kill -15信号只是通知对应的进程要进行"安全、干净的退出",
程序接到信号之后,退出前一般会进行一些"准备工作",
如资源释放、临时文件清理等等,
如果准备工作做完了,再进行程序的终止。

但是,如果在"准备工作"进行过程中,遇到阻塞或者其他问题导致无法成功,那么应用程序可以选择忽略该终止信号。


和kill -15相比,kill -9就相对强硬一点,系统会发出SIGKILL信号,他要求接收到该信号的程序应该立即结束运行,不能被阻塞或者忽略。所以,相比于kill -15命令,kill -9在执行时,应用程序是没有时间进行"准备工作"的,所以这通常会带来一些副作用,数据丢失或者终端无法恢复到正常状态等。

Java是如何处理SIGTERM(15)的我们都知道,在Linux中,Java应用是作为一个独立进程运行的,Java程序的终止运行是基于JVM的关闭实现的,JVM关闭方式分为3种:

正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(接收到SIGINT(2)、SIGTERM(15)信号等)强制关闭:通过调用Runtime.halt方法或者是在操作系统中强制kill(接收到SIGKILL(9)信号)异常关闭:运行中遇到RuntimeException异常等。
JVM进程在接收到kill -15信号通知的时候,是可以做一些清理动作的,比如删除临时文件等。

当然,开发者也是可以自定义做一些额外的事情的,比如让tomcat容器停止,让dubbo服务下线等。

而这种自定义JVM清理动作的方式,是通过JDK中提供的shutdown hook实现的。JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子。例子如下:

package com.hollis;

public class ShutdownHookTest {

public static void main(String[] args) {boolean flag = true;Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("hook execute...");}));while (flag) {// app is runing}System.out.println("main thread execute end...");}

}
执行命令:

➜ jps6520 ShutdownHookTest6521 Jps➜ kill 6520
控制台输出内容:hook execute...

Process finished with exit code 143 (interrupted by signal 15: SIGTERM)
可以看到,当我们使用kill(默认kill -15)关闭进程的时候,程序会先执行我注册的shutdownHook,然后再退出,并且会给出一个提示:interrupted by signal 15: SIGTERM

如果我们执行命令kill -9:

➜ kill -9 6520
控制台输出内容:

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
可以看到,当我们使用kill -9 强制关闭进程的时候,程序并没有执行shutdownHook,而是直接退出了,并且会给出一个提示:interrupted by signal 9: SIGKILL

总结
kill命令用于终止Linux进程,默认情况下,如果不指定信号,kill 等价于kill -15。

kill -15执行时,系统向对应的程序发送SIGTERM(15)信号,该信号是可以被执行、阻塞和忽略的,所以应用程序接收到信号后,可以做一些准备工作,再进行程序终止。

有的时候,kill -15无法终止程序,因为他可能被忽略,这时候可以使用kill -9,系统会发出SIGKILL(9)信号,该信号不允许忽略和阻塞,所以应用程序会立即终止。

这也会带来很多副作用,如数据丢失等,所以,在非必要时,不要使用kill -9命令,尤其是那些web应用、提供RPC服务、执行定时任务、包含长事务等应用中,因为kill -9没给spring容器、tomcat服务器、dubbo服务、流程引擎、状态机等足够的时间进行收尾。

三、过程问题记录

暂时不明确

四、过程问题解决方案

五、心得

六、后话

文中所写不符合逻辑或者不严谨之处,恳望007们海涵;本着知其然,知其所以然的态度,诚请007们留言指正,以免误导他人,若仍未解决大家的问题,望去他处拜询,并翘盼回来留言补充

七 参见:

链接: https://zhuanlan.zhihu.com/p/140531888

kill -9和kill -15区别相关推荐

  1. linux 信号9和信号15,kill -9 和 kill -15 的区别

    相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用的Linux命令也是程序员必备的技能. 但是,怕就怕很多人对于部分命令只是一 ...

  2. kill -9 和 kill -15 的区别

    kill -9 [pid] kill -15 [pid] 建议做法: 先使用kill -15,然后再使用kill -9 

  3. linux kill 12,kill -9 ,kill -12,kill -15

    https://www.cnblogs.com/liuhouhou/p/5400540.html 大家对kill -9 肯定非常熟悉,在工作中也经常用到.特别是你去重启tomcat时.可是多半看来,我 ...

  4. Linux: kill, pkill, killall命令的区别

    一.概要 1. kill 命令根据进程号(pid)杀死单个进程 2. pkill 命令根据名字杀死该名字下的所有进程 3. killall 命令根据名字杀死该名字下的所有进程,跟pkill类似 二.k ...

  5. 信号(三)Kill函数和Kill命令

    一.Kill命令 1.Kill命令: kill -信号编号/信号名 pid 2.Kill命令其实是用来发送信号的,我们常用的Kill -9 pid只是给某个进程发送9号信号而已,而不是说杀死该进程. ...

  6. mysql kill 指令_MySQL kill指令使用指南

    KILL [CONNECTION | QUERY] processlist_id 在Mysql中每个连接都是单独线程运行,可以使用语句 KILL processlist_id statement.来终 ...

  7. kill命令详解kill -9、kill -15区别

    kill相当于赐死,kill -9相当于斩立决 kill命令默认的信号就是15,也就是 kill -15 1.从help中可以清晰的看到 -n 指的是 信号编号 2.kill -l(查看Linux/U ...

  8. Linux kill -9 和 kill -15 的区别

    大家对kill -9 肯定非常熟悉,在工作中也经常用到.特别是你去重启tomcat时.可是多半看来,我们对-9的理解只是表面而已. 很少有人(包括我)认真的去了解一下 kill -n 这个n到底是什么 ...

  9. 2023-04-03 Linux中杀死进程kill和killall命令的区别,着重介绍killall

    一.Linux killall 用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程.kill 命令杀死指定进程 PID,需要配合 ps 使用,而 killall 直接对进程对名字进行操 ...

最新文章

  1. NFS共享服务挂载时出现“access denied by server while mounting”的解决方法
  2. python 代理上网_用Python编写脚本使IE实现代理上网的教程
  3. Caffe 编译安装
  4. UVA 331 Mapping the Swaps
  5. 算法与数据结构(希尔排序)
  6. 感谢有你 WebRTCon 2018优秀出品人、讲师与志愿者
  7. 从线上慢sql看explain关键字
  8. Java基础课程---将一个字符串反转,将字符串中指定部分进行反转,比如,abcdefg, 反转为abfedcg...
  9. 查看屏幕大小_疑似“iPhone 12” 的OLED屏幕组件泄露
  10. xxljob 配置文件_最详细的xxl-job java配置方式spring-boot
  11. 【转载】ubuntu换源
  12. 用C#中的另一个字符串分割一个字符串
  13. proteus 7.8下载链接
  14. 00-各种工具下载链接汇总
  15. Python基础编程(一)
  16. 《解读基金》 基金中统计指标含义-平均回报、标准差、夏普比率、阿尔法系数、贝塔系数、R平方
  17. goldendict 屏幕取词
  18. 虚幻引擎4(UE4)的基本操作Actor的操作
  19. 【系统集成项目管理工程师】信息系统集成及服务
  20. 六边形俄罗斯方块游戏创意

热门文章

  1. 计算机我的文档data,将Win7用户文件夹(“我的文档”)的默认位置移至D_IT / Computer_Professional Inform...
  2. 2020年宇通大量裁人论坛_2020年借壳上市第一单来袭,宇通重工拟借壳ST宏盛
  3. 基于树莓派的Lede系统安装
  4. 图腾柱驱动电路-MOS和三极管
  5. ChatGPT和代码智能
  6. 超强音质国产半入耳耳机来袭!NANK南卡首款蓝牙5.3小音舱发布
  7. 修改过高分辨率导致显示器黑屏 - 解决之无脑篇
  8. 万里学院ACM宣传片
  9. 涵盖从Java 5到Java 11所有重要特性,让Java学习不再难!
  10. EllisysBluetoothAnalyzer 下载 最新版