只会一点java

java持续学习者,每月一篇博客。罗列出技术栈,慢慢完善,持续学习,总有一天,你会追上甚至超越曾经的大神。
随笔 - 156, 文章 - 0, 评论 - 471, 阅读 - 124万
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

secureCRT关闭连接自动关闭tomcat服务

Posted on   只会一点java  阅读(2746)  评论(0编辑  收藏  举报

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

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这个信号导致最终关闭进程,具体流程如下:
SIGINT
SIGQUIT
SIGHUP
|-sshd(1622)-+-sshd(11681)---sshd(11699)---bash(11700)---test.sh(13285)---tail(13299)
SIGHUP
SIGHUP
SIGHUP
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/

 

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示