Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >进程管理:kill 命令之 -9 与 -15

进程管理:kill 命令之 -9 与 -15

作者头像
程序员架构进阶
发布于 2021-03-04 06:56:02
发布于 2021-03-04 06:56:02
7.1K02
代码可运行
举报
文章被收录于专栏:架构进阶架构进阶
运行总次数:2
代码可运行

相关系列文章:

Linux 系统】一个常驻进程问题的再次分析

一 进程状态转换

二 kill命令回顾

kill :发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。若仍无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。

2.1 kill命令参数

在命令行输入kill,可以看到参数提示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

参数说明:

-l <信号编号>,若不加信号的编号参数,则使用“-l”参数会列出全部的信号名称。常用的kill -15,kill -9这里的9 和 15就是信号;

-a 当处理当前进程时,不限制命令名和进程号的对应关系;

-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号;

-s 指定发送信号;

-u 指定用户;

2.2 信号

使用kill -l 可以列举所有支持的信号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[admin@test-3 ~]$ kill -l 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR111) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+338) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+843) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+1348) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-1253) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-758) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-263) SIGRTMAX-1	64) SIGRTMAX

也可以通过kill -l SIGHUP 查指定信号对应的数值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[admin@test-3 ~]$ kill -l SIGHUP
1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
几个常用的信号如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HUP 1 终端断线INT 2 中断(同 Ctrl + CQUIT 3 退出(同 Ctrl + \)TERM 15 终止KILL 9 强制终止CONT 18 继续(与STOP相反, fg/bg命令)STOP 19 暂停(同 Ctrl + Z

其中,信号如果没有指定的话,默认会发出终止信号(15)。比较常用的就是强制终止信号:9终止信号:15,另外,中断信号:2其实就是Ctrl + C结束前台进程。

2.3 kill -15与kill -9

当我们使用kill pid时,实际相当于kill -15 pid。也就是说默认信号为15。使用kill -15时,系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该信号后,具体要如何处理自己可以决定。

这时候,应用程序可以选择:

  • 1、立即停止程序
  • 2、释放响应资源后停止程序
  • 3、忽略该信号,继续执行程序

因为kill -15信号只是通知对应的进程要进行"安全、干净的退出",程序接到信号之后,退出前一般会进行一些"准备工作",如资源释放、临时文件清理等等,如果准备工作做完了,再进行程序的终止。

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

这也就是为什么我们有的时候使用kill命令是没办法"杀死"应用的原因,因为默认的kill信号是SIGTERM(15),而SIGTERM(15)的信号是可以被阻塞和忽略的。

kill -15相比,kill -9就相对强硬得多,系统会发出SIGKILL信号,他要求接收到该信号的程序应该立即结束运行,不能被阻塞或者忽略。

所以,kill -9在执行时,应用程序是没有时间进行"准备工作"的,所以这通常会带来一些副作用,数据丢失或者终端无法恢复到正常状态等。

三 Java应用对SIGTERM信号的处理

Java应用在Linux中是以一个独立进程的形式运行的,Java程序的终止运行基于JVM的关闭实现,JVM关闭方式分为3种:

正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(接收到SIGINT(2)、SIGTERM(15)信号等) 强制关闭:通过调用Runtime.halt方法或者是在操作系统中强制kill(接收到SIGKILL(9)信号) 异常关闭:运行中遇到RuntimeException异常等。

JVM进程在接收到kill -15信号通知的时候,会做一些清理动作的,例如删除临时文件。同时,也提供了hook机制,来让开发者自定义清理动作,对应的方法为:Java.Runtime.addShutdownHook(Thread hook)。我们可以自定义一个shuthook并测试效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package shutdown;
import java.util.concurrent.TimeUnit;

public class MyShutdownHook {
    public static void main(String[] args) throws InterruptedException{
        boolean flag = true;
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("my hook execute end");
        }));

        while (flag) {
            System.out.println("my app is running");
            TimeUnit.SECONDS.sleep(3);
        }
        System.out.println("main thread execute end");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IDE内执行后,进程会一直存在,我们在其中加了一个死循环保证进程常驻,且每3秒钟打印一次app正在运行中。通过jps命令查看进程id,并执行kill命令,查看执行效果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
192:dubbo-proxy-tools xxx$ jps
24272 
6178 Launcher
6179 MyShutdownHook
6182 Jps
99256 RemoteMavenServer
585 UserClient
24446 war
192:dubbo-proxy-tools xxx$ kill 6179
代码语言:javascript
代码运行次数:0
运行
复制

其中6179 MyShutdownHook是我们的这个程序运行进程。执行kill后可以看到程序运行控制台的输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my app is running
my app is running
my app is running
my hook execute end

Process finished with exit code 143 (interrupted by signal 15: SIGTERM)
代码语言:javascript
代码运行次数:0
运行
复制

可见hook被执行,并且给了接收到signal 15信号的提示后,线程中断,所以没有执行结尾的打印主线程退出记录(第13行的System.out.println("main thread execute end");)。

再次运行程序,我们来看看kill -9执行的效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
my app is running
my app is running

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

可见kill -9 强杀进程后,没有执行shutdownHook,而是直接退出。给出的提示为:interrupted by signal 9: SIGKILL。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员架构进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
linux系列之:告诉他,他根本不懂kill
和很多程序员打过交道,这些程序员可能熟知for遍历的好几种写法,但是却对写出来的程序部署的环境一无所知。我敢打赌,在spring boot出现之后,已经很少有程序员知道tomcat到底是怎么运行的了。对于他们来说,运行一个jar包就完事了。
程序那些事
2021/09/15
3570
Linux系统编程-进程概念、进程管理、信号处理
操作系统里的进程是程序一次执行的过程,是操作系统动态执行的基本单元;每当创建新的进程后,操作系统会为新的进程分配一个唯一的标识符,方便后续管理进程。
DS小龙哥
2022/02/17
1K0
【linux命令讲解大全】157.深入探究Linux操作系统中的halt和kill命令的用途和功能
halt命令用来关闭正在运行的Linux操作系统。halt命令会先检测系统的runlevel,若runlevel为0或6,则关闭系统,否则即调用shutdown来关闭系统。
全栈若城
2024/03/02
1890
一个 Node 进程的死亡与善后
人固有一死,一个 Node 进程亦是如此,总有万般不愿也无法避免。从本篇文章我们看看一个进程灭亡时如何从容离去。
山月
2021/03/16
1.2K0
Linux命令(54)——trap命令(builtin)
trap命令是Shell内建命令,用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。
恋喵大鲤鱼
2019/03/05
2K0
Linux的进程管理
而 kill 命令用于输出特定的信号给指定进程号(PID)的进程并根据该信号完成指定的行为,其中可能的信号有进程挂起、进程等待、进程终止等
姚远OracleACE
2023/04/06
1.6K0
Linux的进程管理
一天一个 Linux 命令(36):kill 命令
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/187
joshua317
2021/11/10
4480
Linux 信号(Signal)
我们经常会使用 kill 命令杀掉运行中的进程,对多次杀不死的进程进一步用 kill -9 干掉它。你可能知道这是在用 kill 命令向进程发送信号,优雅或粗暴的让进程退出。我们能向进程发送很多类型的信号,其中一些常见的信号 SIGINT 、SIGQUIT、 SIGTERM 和 SIGKILL 都是通知进程退出,但它们有什么区别呢?很多人经常把它们搞混,这篇文章会让你了解 Linux 的信号机制,以及一些常见信号的作用。
mazhen
2023/11/24
1.5K0
Linux 信号(Signal)
优雅的重启服务
每次更新完代码,更新完配置文件后 就直接这么 ctrl+c 真的没问题吗,ctrl+c到底做了些什么事情呢?
sunsky
2020/08/20
1.8K0
每天学一个 Linux 命令(90):kill/killall
kill 命令用于删除执行中的程序或工作。kill 命令向进程发送信号。如果您未指定要发送的信号,则默认情况下会发送 TERM 信号,从而终止该过程。
民工哥
2021/04/21
4500
kill -?
[root@VM-8-35-centos /data/server/fatp_dw_base]# kill -l
二锅头一桶天下
2023/12/15
2120
Gin框架优雅关机和重启
我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优雅的方式来实现关机或重启呢?
玖柒的小窝
2021/10/06
1.4K0
kill(1) command
kill 命令可以发送指定的信号到相应的进程或进程组。不指定信号缺省发送 SIGTERM(15)来终止指定进程。如果想强制终止进程,可以显示指定 SIGKILL(9) 信号,因为该信号无法被进程捕获。
恋喵大鲤鱼
2023/10/12
2800
Linux之kill命令
原文链接:https://rumenz.com/rumenbiji/linux-kill.html
入门笔记
2021/07/27
4.5K0
Linux进程间通信(三) - 信号
什么是信号 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。 收到信号的进程对各种信号有不同的
三丰SanFeng
2018/01/16
2.6K0
linux | kill命令详解以及linux中的信号
在man手册中对kill命令的解释如下, 不难看出, kill命令是一个用于将指定的signal发送给进程的工具
Amadeus
2023/04/12
2.8K0
linux常用命令~系统常用命令
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
Vincent-yuan
2021/12/20
1.4K0
linux常用命令~系统常用命令
Linux—进程管理
当程序运行的时候会由父进程通过fock创建子进程来处理任务;子进程被创建后开始处理任务,当任务处理完毕后就会退出,然后子进程会通知父进程来回收资源;如果子进程处理任务期间,父进程意外终止了,那么这个子进程就变成了僵尸进程。
Alone-林
2022/08/23
5K0
Linux—进程管理
Linux 精通Linux的“kill”命令
无论你使用哪种操作系统,你一定会遇到某个行为失常的应用,它把自己锁死并拒绝关闭。在Linux(还有Mac),你可以用一个”kill”命令强制终结它。本篇博文中,我们将展示给你多种方式使用”kill”命令终结应用。
小小工匠
2021/08/16
3.8K0
linux中kill命令详解_linux kill函数
发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。如果无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户可操作所有用户的进程,非root用户只能操作自己的进程。
全栈程序员站长
2022/11/17
4.4K0
相关推荐
linux系列之:告诉他,他根本不懂kill
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验