使用 kill 命令杀死 java进程,你用对了吗?


在本地调试agent相关功能,需要经常性的杀掉Java进程,验证一些极端情况。

每次都是本能执行如下步骤

  • jps
  • kill -9 <pid>
  • reboot

有一次验证,发现代码中添加的ShutdownHook没有生效,难道和kill命令后面的数字有关?

经过一番查阅,后面的数字代表的是具体信号,kill命令可将指定的信号发送给相应的进程,linux中常见的信号如下:

  • 1 SIGHUP 挂起进程
  • 2 SIGINT 终止进程
  • 3 SIGGQUIT 停止进程
  • 9 SIGKILL 无条件终止进程
  • 15 SIGTERM 尽可能终止进程
  • 17 SIGSTOP 无条件停止进程,但不是终止
  • 18 SIGTSTP 停止或者暂停进程,但不终止进程
  • 19 SIGCONT 继续运行停止的进程

kill命令默认情况使用15,下面我们验证下使用不同信号,有什么不同的表现。

创建一个springBoot应用

启动类如下,添加了一个钩子函数,当进程关闭时,将会调用该钩子函数。

@SpringBootApplication
public class Server {
    public static void main(String[] args) {
        SpringApplication.run(Server.class);

        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run() {
                System.out.println("do ShutdownHook.......... ");
            }
        });
    }
}

你可以通过

java -jar ~/project/web/target/demo-1.0.jar

也可以加上nohup + &启动

nohup java -jar ~/project/web/target/demo-1.0.jar   &

通过后者启动,可以看到启动所在的目录多了一个文件nohup.out,该文件记录了应用启动运行过程中的日志。

&表示以后台方式运行应用。但如果退出关闭启动的控制台,进程将会停止。

nohup + &也是以后台方式运行应用,但是退出关闭启动的控制台,进程不会停止,且进程日志将会输出到nohup.out中。

kill -3

通过执行jps 拿到对应的pid

并执行 kill -3 5085,惊奇的发现,Java进程并没有被杀掉,而是打印了一堆线程信息。

kill -9

上一步的 kill -3 并没有成功的把进程杀掉,我们继续使用之前的pid。

这次执行 kill -9 5085

执行完 -9,java进程消失了,只留下这么一段话。

kill -15

最后,再试试 kill -15,犹豫Java进程已经被 -9 给kill了,需要重新启动一次。

这一次,它打印了钩子函数中的信息,随之进程也消失了。

总结

kill -3 <pid> 这玩意一般用不到,可以打印当前进程的线程信息,但是不会关闭Java应用!

kill -9 <pid> 很暴力,不会调用钩子函数ShutdownHook。

kill <pid> 也就是kill -15 <pid> 很柔和,将会调用钩子函数ShutdownHook,一般ShutdownHook中会进行一些操作,比如保存数据,关闭连接等。

原文地址:https://www.jianshu.com/p/77ca821e7151

原文地址:https://www.cnblogs.com/jpfss/p/12001194.html

时间: 2024-07-30 11:02:28

使用 kill 命令杀死 java进程,你用对了吗?的相关文章

自定义命令杀死 java 进程 alias kjava

alias kjava='ps -ef|grep ProcessName |awk "{print $2}"|xargs kill -9' 上面脚本放在杀JAVA进程中,会出现一些错误警告提示,如果把 aux 改成 ef ,连同SecureCRT也会断开连接 杀死java 进程 ps -ef|grep java |grep -v grep|cut -c 9-15|xargs kill -9 编辑别名 alias kjava='ps -ef|grep java |grep -v grep

shell学习五十二天----删除进程kill命令

进程的控制与删除 使用kill命令可以终止进程.通常,终止一个前台进程可以使用ctrl+C键,但是对于一个后台进程就必须使用kill命令来终止,我们需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉进程.kill命令是通过向进程发送指定的信号来结束相应进程的.在默认情况下,采用编号为15的TREM信号.TERM信号将终止所有不能获取该信号的进程.对于那些可以获取该信号的进程就要用编号为9的kill信号,强行"杀掉"该进程. kill命令详解

运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)> <运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析> <运维经验分享(五)-- 改进的java进程管

Linux系统下如何优雅地关闭Java进程?

资料出处: http://www.sohu.com/a/329564560_700886 https://www.cnblogs.com/nuccch/p/10903162.html 前言 Linux系统下如何kill掉一个后台Java进程,相信童鞋们都知道如何操作.首先使用ps命令查找该Java进程的进程ID,然后使用kill命令进行杀掉.命令如下: (1)ps查进程ID [[email protected] ~]$ ps -ef | grep Test user 2095020809 0 2

linux命令总结kill命令详解

1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送的信号. -p:模拟发送信号. -l:指定信号的名称列表. pid:要中止进程的ID号. Signal:表示信号. 4.说明 进程是Linux系统中一个非常重要的概念.Linux是一个多任务的操作系统,系统上经常同时运行着多个进程.我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的

七. 性能监控和优化命令 42 - Kill命令

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理常用命令.通常终止一个前台进程可以使用Ctrl+C键,但是对于一个后台进程就必须使用kill命令来终止,我们需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉进程.kill命令是通过向进程发送指定的信号,强行"杀掉"该进程. 1.命令格式: kill[参数][进程号] 2.命令功能: 发送指定的信号到相应的进程.不指定信号将发

如何查看Java进程并获取进程ID?

1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps 命令用于查看当前正在运行的进程.grep 是搜索例如: ps -ef | grep java表示查看所有进程里 CMD 是 java 的进程信息ps -aux | grep java-aux 显示所有状态ps3. kill 命令用于终止进程例如: kill -9 [PID]-9 表示强迫进程立即停

top,kill命令

[[email protected] ~]# top top - 09:23:10 up 23 min,  1 user,  load average: 0.00, 0.00, 0.00 Tasks:  75 total,   2 running,  73 sleeping,   0 stopped,   0 zombie Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st Mem:   2

Java进程内存泄漏判断及解决方法

内存泄漏种类Java使用的内存种类包含三种,这三种类型的内存都可能发生内存泄漏.? 堆内存泄漏,如果JVM 不能在java 堆中获得更多内存来分配更多java 对象,将会抛出java堆内存不足(java OOM) 错误.如果java 堆充满了活动对象,并且JVM 无法再扩展java 堆,那么它将不能分配更多java 对象.更多情况是程序设计有问题,生成的对象占用过多的堆内存造成堆内存泄漏.? 本地内存泄漏, 如果JVM 无法获得更多本地内存,它将抛出本地OOM错误.当进程用到的内存到达操作系统的