• 使用 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);
    
        <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
  • 相关阅读:
    搜索入门
    计算几何基础
    对“学生自行组队,共同完成实验”的一些思考感慨
    20145213《信息安全系统设计》第十一周学习总结
    20145213《信息安全系统设计基础》第十周学习总结
    记与舍友摩擦的一两事儿
    20145213《信息安全系统设计》第九周学习总结下篇
    20145213《信息安全基础设计》第九周学习总结上篇
    20145213《信息安全设计系统》实验报告一
    20145213《信息安全系统设计基础》第八周学习总结下篇
  • 原文地址:https://www.cnblogs.com/jpfss/p/12001194.html
Copyright © 2020-2023  润新知