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/,写的很详细。

时间: 2024-10-12 13:44:16

tomcat进程意外退出的问题分析的相关文章

(转)tomcat进程意外退出的问题分析

节前某个部门的测试环境反馈tomcat会意外退出,我们到实际环境排查后发现不是jvm crash,日志里有进程销毁的记录,从pause到destory的整个过程: org.apache.coyote.AbstractProtocol pause Pausing ProtocolHandler org.apache.catalina.core.StandardService stopInternal Stopping service Catalina org.apache.coyote.Abstr

tomcat进程意外退出的问题分析(转)

原文链接:http://hongjiang.info/why-kill-2-cannot-stop-tomcat/ 节前某个部门的测试环境反馈tomcat会意外退出,我们到实际环境排查后发现不是jvm crash,日志里有进程销毁的记录,从pause到destory的整个过程: org.apache.coyote.AbstractProtocol pause Pausing ProtocolHandler org.apache.catalina.core.StandardService stop

32位win7系统下配置IIS遇到php-cgi.exe - FastCGI 进程意外退出问题的解决办法

今天重装了一下系统,是32位的WIN7,装完系统后想把IIS装回来,因为有时候需要用到笔记本处理一些事情,结果WEB服务器正常了,但IIS的FASTCGI模块始终不能解析PHP,一直报php-cgi.exe - FastCGI 进程意外退出的错误,于是上网找了一下解决办法,将解决过程写下来,以备忘: 解决的思路很简单,既然是不能解析PHP,那就直接运行一下PHP,看会报什么错,再对症下药,于是,在命令提示符窗口进入php安装的根目录,然后运行php -v的命令,这时窗口弹出计算机丢失msvcr1

"php-cgi.exe - FastCGI 进程意外退出" 解决办法

问题描述: win7下iis中php-cgi.exe - FastCGI 进程意外退出 错误提示: HTTP 错误 500.0 - Internal Server Error D:\phpStudy\phpf\php-cgi.exe - FastCGI 进程意外退出 解决方案1: 服务器windows2008上面配置PHP时. IIS7.0显示正常,但phpinfo.php显示不正常,出现"HTTP 错误 500.0 - Internal Server Error  C:\PHPServer\P

"php-cgi.exe - FastCGI 进程意外退出" 的解决办法

服务器windows2008上面配置PHP时. IIS7.0显示正常,但phpinfo.php显示不正常,出现"HTTP 错误 500.0 - Internal Server Error  C:\PHPServer\PHP\php-cgi.exe - FastCGI 进程意外退出"的提示. 双击PHP目录下的文件php.exe则出现"msvcr110.dll"丢失的提示. 到Microsoft网站下载"Microsoft Visual C++ 2012 R

IIS出现“HTTP 错误 500.0,C:\php\php-cgi.exe - FastCGI 进程意外退出”解决方法

昨天给大家介绍了在windows+iis的平台上搭建支持php+mysql平台的文章,教程步骤都是笔者一步一个操作然后一个记录介绍给大家的,实机演练,教程绝对切实可用,但是不同的同学在不同的环境下按照步骤操作,多多少少还是会出现这样那样的问题,比如很多同学经常会遇到的问题:“HTTP 错误 500.0 - Internal Server Error,C:\php\php-cgi.exe - FastCGI 进程意外退出”,就一直困扰着不少人,既然这个问题比较突出,那么今天亦是美网络小编就手把手的

WIN服务器出现 php-cgi.exe - FastCGI 进程意外退出

既然是不能解析PHP,那就直接运行一下PHP,看会报什么错,再对症下药,于是,在命令提示符窗口进入php安装的根目录,然后运行php -v的命令,这时窗口弹出计算机丢失msvcr110.dll的错误,知道具体的错误就好办了,安装一下MICROSOFT VISUAL C++ 2012 RUNTIME LIBRARIES的,IIS就能正常解析PHP啦. 还有比如需要注意PHP的基本配置,没什么意外的话,很快就没问题了.

IIS配置PHP遇到FastCGI 进程意外退出问题解决

在php配置无问题的情况下,出现此问题!需要下载微软的msvcr110.dll,因为现在所有的 5.5 环境都是基于 vc11 的编译脚本下生成的, 下载地址:http://www.microsoft.com/zh-CN/download/details.aspx?id=30679

HTTP 错误 500.0 - Internal Server Error D:\...php-cgi.exe路径) - FastCGI 进程意外退出

在一台新服务器上,安装新网站,之前只放至了一个网站.是服务器商配置好的,非集成环境. 添加了一个新站,路径都制定好了,但是在访问时出现了500错误.提示貌似是php的问题,但是之前的网站,运行的是discuz,一切正常,加了个新网站就报错.用phpinfo语句执行也是同样的错误. 经过一番百度,解决方法如下. 打开iis,应用程序池.选择右侧的设置应用程序池默认设置. 在弹出的窗口中,找到标识,点击右侧的小方块. 把值改为LocalSystem.重启IIS,即可解决.