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

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

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

jps

kill -9

reboot

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

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

1 SIGHUP 挂起进程

2 SIGINT 终止进程

3 SIGGQUIT 停止进程

9 SIGKILL 无条件终止进程

15 SIGTERM 尽可能终止进程

17 SIGSTOP 无条件停止进程,但不是终止

18 SIGTSTP 停止或者暂停进程,但不终止进程

19 SIGCONT 继续运行停止的进程

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

创建一个springBoot应用

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

你可以通过

也可以加上nohup + &启动

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

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

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

kill -3

通过执行jps 拿到对应的pid

53db04c756e31fe788ae44edca95a636.png

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

78908a937f91eba077557f1df7a562af.png

kill -9

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

这次执行 kill -9 5085

4b7b46541ac2df841c45b711172a92b7.png

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

kill -15

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

1c13bbd372129418eba7b189e626de92.png

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

总结

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值