在本地调试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);
    <span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addShutdownHook</span><span class="token punctuation">(</span><span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token annotation punctuation"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Override</span></span></span></span>
<span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token function"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">run</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"do ShutdownHook.......... "</span></span></span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

你可以通过

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

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

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

    alias kjava='ps -ef|grep ProcessName |awk "{print $2}"|xargs kill -9' 上面脚本放在杀JAVA进程中,会出现一些 ...

  2. kill 命令在Java应用中使用注意事项

    前言 我们都知道,kill在linux系统中是用于杀死进程. kill pid [..] kill命令可将指定的信号发送给相应的进程或工作. kill命令默认使用信号为15,用于结束进程或工作.如果进 ...

  3. 【linux】linux查看资源任务管理器,使用top命令 + 查看java进程下的线程数量【两种方式】

    ================================ 详解:https://blog.csdn.net/achenyuan/article/details/77867661 ======= ...

  4. linux 使用kill命令杀死进程的几个办法

    常规篇: 首先,用ps查看进程,方法如下: $ ps -ef ……smx       1822     1  0 11:38 ?        00:00:49 gnome-terminalsmx   ...

  5. 根据端口号,利用DOS命令杀死进程

    比如利用DOS命令找出占用8080端口的程序的PID 然后用DOS命令杀死该进程 kill

  6. 如何优雅地停止Java进程

    目录 理解停止Java进程的本质 应该如何正确地停止Java进程 如何注册关闭钩子 使用关闭钩子的注意事项 信号量机制 总结 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境 ...

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

    资料出处: http://www.sohu.com/a/329564560_700886 https://www.cnblogs.com/nuccch/p/10903162.html 前言 Linux ...

  8. kill命令

    *杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志.   首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:   # kill -pid   注释:标准的kill命令通 ...

  9. Linux删除多个java进程的其中一个

    一.背景: Linux后台运行了多个Java程序,进程名都是java. 执行pkill java会一次性杀掉所有的java进程. 二.解决思路: 先通过一定的检索条件,定位出指定的java进程 然后解 ...

随机推荐

  1. ServerManager.exe 0xc0000135 应用程序错误

    问题: 将 Windows Server 2016 .NET Framework移除. IIS卸载后, Server Manager.exe.事件查看器等都无法正常开启. 解决方案: 在运行中,输入C ...

  2. Shell字符串截取(非常详细)

    假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 1 echo ${var#*//} 其中 var 是变量名,# 号是运算符, ...

  3. 微信token介绍

    这里的微信token 有以下三种 1.小程序的token  (appid+appsecret=token) 2.一个是第三方平台token(comment_appid+comment_appsecre ...

  4. mysql中包含长字段索引的优化

    不同于oracle,在mysql的Innodb存储引擎中,对索引的总长度有限制.在mysql 5.7中(https://dev.mysql.com/doc/refman/5.7/en/innodb-r ...

  5. url的长度问题

    url最长支持多少字符? 在http协议中,其实并没有对url长度作出限制,往往url的最大长度和用户浏览器和Web服务器有关,不一样的浏览器,能接受的最大长度往往是不一样的,当然,不一样的Web服务 ...

  6. WebRTC搭建前端视频聊天室——数据通道篇

    本文翻译自WebRTC data channels 在两个浏览器中,为聊天.游戏.或是文件传输等需求发送信息是十分复杂的.通常情况下,我们需要建立一台服务器来转发数据,当然规模比较大的情况下,会扩展成 ...

  7. IDEA 使用SequenceDiagram插件绘制时序图

    最近看代码,由于代码的调用层级深度比较多,层层深入到某处时,已经忘记了身处何处,虽然自己可以使用一些画图工具来时序图,但是,这种情况下,自己画时序图很繁琐,比较浪费时间,上网找了一下IDEA有一个插件 ...

  8. 【SpringBoot】SpringBoot与SpringMVC自动配置(五)

    本文介绍SpringBoot对Spring MVC自动配置,SpringBoot自动配置原理可以参考:[SpringBoot]SpringBoot配置与单元测试(二) 首先新建一个SpringBoot ...

  9. Operation之结合操作符

    startWith 该方法会在Observable序列开始之前插入一些事件元素. 即发生事件消息之前, 会发出这些预先插入的事件消息 Observable.of("2", &quo ...

  10. OpenShift 4.2 etcd operatorhub离线环境部署

    本文记录在OperatorHub中存在界面但缺少镜像的环境下如何安装部署.感谢王征提供的大力支持和指导. 现在一个在线环境找到etcd所需要的镜像 quay.io/coreos/etcd-operat ...