zoukankan      html  css  js  c++  java
  • secureCRT关闭连接自动关闭tomcat服务

    下午遇到一个神奇的问题:

    secureCRT登陆某个服务器,用shell脚本启动./catalina.sh start,打开日志tail -f catalina.out,此时 手动关闭连接窗口,导致tomcat的服务竟然关闭了,看日志,截图如下:

    仔细看图,发现关键字:

    AbstractProtocol pause、org.apache.catalina.core.StandardService stopInternalDubboShutdownHook、EventThread shut down很明显不是正常关闭打印的节奏。应该是触发内核操作甚至还挂上了钩子。上网一搜果然有问题:

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

     脚本简化如下:

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

    关闭的原因:

       关闭ssh终端窗口时,sshd向下游进程发送SIGHUP
    SIGHUP这个信号导致最终关闭进程,具体流程如下:

    在非交互模式下,shell对java进程设置了SIGINTSIGQUIT信号设置了忽略,但并没有对SIGHUP信号设为忽略。再看一下当时的进程层级:
    |-sshd(1622)-+-sshd(11681)---sshd(11699)---bash(11700)---test.sh(13285)---tail(13299)

    sshd把SIGHUP传递给bash进程后,bash会把SIGHUP传递给它的子进程,并且对于其子进程test.sh,bash还会对test.sh的进程组里的成员都传播一遍SIGHUP。因为java后台进程从父进程catalina.sh(又是从其父进程test.sh)继承的pgid,所以java进程仍属于test.sh进程组里的成员,收到SIGHUP后退出。

    解决方案,加入一行 set -m 开启作业模式:

    #!/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://ifeve.com/why-kill-2-cannot-stop-tomcat/

  • 相关阅读:
    微信菜单设置为小程序报错85005错误
    VS2013常用快捷键
    VS2017专业版和企业版激活密钥
    微信小程序image组件binderror使用例子(对应html、js中的onerror)
    本科无学位有哪些途径来获得硕士学位
    asp.net 微信JsSDK
    使用nginx反向代理,一个80端口下,配置多个微信项目
    对称与非对称加密;SSL;HTTPS;AJP
    java 在实例化异常的时候做的事情
    简单理解正向,反向,透明代理
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/6871873.html
Copyright © 2011-2022 走看看