secureCRT关闭连接自动关闭tomcat服务
2023-09-11 14:19:37 时间
下午遇到一个神奇的问题:
secureCRT登陆某个服务器,用shell脚本启动./catalina.sh start,打开日志tail -f catalina.out,此时 手动关闭连接窗口,导致tomcat的服务竟然关闭了,看日志,截图如下:
仔细看图,发现关键字:
AbstractProtocol pause、
org.apache.catalina.core.StandardService stopInternal
、DubboShutdownHook、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进程设置了SIGINT
,SIGQUIT
信号设置了忽略,但并没有对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/
相关文章
- tomcat 内存大小配置
- 深入浅出Tomcat/3 - Tomcat生命周期
- [转]Eclipse中的Web项目自动部署到Tomcat
- Tomcat 启动失败问题【shutdown端口占用】
- eclipse导入tomcat时Unknown version of Tomcat was specified
- Tomcat SSL配置 Connector attribute SSLCertificateFile must be defined when using SSL with APR解决
- tomcat的文件路径 servelet的配置 以及maven中的WEB-INF的路径
- TCP 连接的 TIME_WAIT 过多 导致 Tomcat 假死
- Tomcat(三):tomcat处理连接的详细过程
- Tomcat v7.0 Server at localhost are already in use,tomcat提示端口被占用,tomcat端口已经被使用,tomcat端口占用
- IDEA+Tomcat热部署自动编译
- ubuntu 安装tomcat
- Tomcat 关闭时报错
- Tomcat启动报错org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"]”
- Tomcat_启动多个tomcat时,会报StandardServer.await: Invalid command '' received错误
- Apache + Tomcat集群配置详解 (1)
- Nginx + Tomcat Windows下的负载均衡配置
- supervisor开机自动启动脚本+redis+MySQL+tomcat+nginx进程自动重启配置
- Tomcat会话超时时怎样记录操作日志,满足安全审计要求
- eclise配置tomcat出现服务Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4 and Java EE 5 Web modules
- centos 7 使用Ansible 发布多个 tomcat 服务
- jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第三话):创建一个自由风格的项目(非maven),实现自动打war包
- 使用Maven自动部署Java Web项目到Tomcat问题小记
- 真正实现一键自动化部署,Nginx+Tomcat+Redis 实现负载均衡集群服务搭建,所有文件自动生成,包括自动生成配置文件参数、解决依赖问题、Session共享同步、反向代理等等