zoukankan      html  css  js  c++  java
  • tomcat进程意外退出的问题分析

    1) tomcat不是通过脚本正常关闭(viaport: 即通过8005端口发送shutdown指令)

    因为正常关闭(viaport)的话会在 pause 之前有这样的一句warn日志:

        org.apache.catalina.core.StandardServer await
        A valid shutdown command was received via the shutdown port. Stopping the Server instance.
        然后才是 pause -> stop -> destroy 
    
    2) tomcat的shutdownhook被触发,执行了销毁逻辑

    而这又有两种情况,一是应用代码里有地方用System.exit来退出jvm,二是系统发的信号(kill -9除外,SIGKILL信号JVM不会有机会执行shutdownhook)

    先通过排查代码,应用方和中间件团队都排查了System.exit在这个应用中使用的可能。那就只剩下Signal的情况了;经过一番排查后,发现每次tomcat意外退出的时间与ssh会话结束的时间正好吻合。

    有了这个线索之后,银时同学立刻看了一下对方测试环境的脚本,简化后如下:

    $ cat test.sh
    #!/bin/bash
    cd /data/server/tomcat/bin/
    ./catalina.sh start
    tail -f /data/server/tomcat/logs/catalina.out
    

    tomcat启动为后,当前shell进程并没有退出,而是挂住在tail进程,往终端输出日志内容。这种情况下,如果用户直接关闭ssh终端的窗口(用鼠标或快捷键),则java进程也会退出。而如果先ctrl-c终止test.sh进程,然后再关闭ssh终端的话,则java进程不会退出。

    这是一个有趣的现象,catalina.sh start方式启动的tomcat会把java进程挂到init(进程id为1)的父进程下,已经与当前test.sh进程脱离了父子关系,也与ssh进程没有关系,为什么关闭ssh终端窗口会导致java进程退出?

    如果我们在test.sh里设置开启作业控制的话,就不会让java进程退出了

    #!/bin/bash
    set -m  
    cd /home/admin/tt/tomcat/bin/
    ./catalina.sh start
    tail -f /home/admin/tt/tomcat/logs/catalina.out
    

    此时java后台进程继承父进程catalina.sh的pgid,而catalina.sh不再使用test.sh的进程组,而是自己的pid作为pgid,catalina.sh进程在执行完退出后,java进程挂到了init下,java与test.sh进程就完全脱离关系了,bash也不会再向它发送信号。

    详情参考:http://hongjiang.info/why-kill-2-cannot-stop-tomcat/,写的很详细。

  • 相关阅读:
    Python之图片格式转换
    pip依赖安装与记录
    Spectral Graph Theory的一些定理
    Beamer加中文
    Python之json
    Windows之建立C++开发环境
    Mysql分表教程
    null和空 not null
    yii 隐藏index.php的步骤
    yii泛域名
  • 原文地址:https://www.cnblogs.com/d-blog/p/4831227.html
Copyright © 2011-2022 走看看