这里只讲述遇到的一种原因:
# 服务停止
最初以为是 jvm 导致的,但是在 /var/log 并没有找到 jvm 致命错误日志(hs_err_pid.log)
又排除了 GC 情况,使用 jstat -gc pid 5000 查看也没发现问题
最后还是从日志入手
原因:日志中存在不明进程销毁日志,如下:
Nov 09, 2017 5:30:29 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-8080"]
Nov 09, 2017 5:30:29 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
Nov 09, 2017 5:30:29 PM org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
Nov 09, 2017 5:30:29 PM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["http-bio-8080"]
Nov 09, 2017 5:30:29 PM org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["ajp-bio-8009"]
Nov 09, 2017 5:30:29 PM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-bio-8080"]
Nov 09, 2017 5:30:29 PM org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["ajp-bio-8009"]
而正常使用 shutdown.sh 关闭时,会在 pause 日志前存在以下日志:
Nov 10, 2017 9:25:08 AM org.apache.catalina.core.StandardServer await
INFO: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
Nov 10, 2017 9:25:08 AM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-nio-9080"]
Nov 10, 2017 9:25:08 AM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-9009"]
可见 tomcat 不是通过正常脚本关闭
还有一种情况是执行 kill -9 pid,但是测试了一下,这种情况并没有产生日志
最后怀疑与 ssh 会话有关,因为我用的是 windows+xshell,下班时直接关闭 xshell,而恰巧此时 tomcat 也随之停止了服务。可能是用户直接关闭了 ssh 会话导致了 java 进程的强制退出。
下面针对 ssh 可能引发的问题做了测试:
先关闭服务器
- 使用命令:sh bin/startup.sh 启动,此时强制关闭 xshell,再登录 xshell, 使用 grep 查看运行的 tomcat,发现 tomcat 依然运行。
- 使用命令:sh bin/startup.sh & tail -f logs/catalina.out 启动并查看日志,此时强制关闭 xshell,再登录 xshell, 使用 grep 查看运行的 tomcat,发现 tomcat 已关闭。