这里只讲述遇到的一种原因:

# 服务停止

最初以为是 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 可能引发的问题做了测试:

先关闭服务器

  1. 使用命令:sh bin/startup.sh 启动,此时强制关闭 xshell,再登录 xshell, 使用 grep 查看运行的 tomcat,发现 tomcat 依然运行。
  2. 使用命令:sh bin/startup.sh & tail -f logs/catalina.out 启动并查看日志,此时强制关闭 xshell,再登录 xshell, 使用 grep 查看运行的 tomcat,发现 tomcat 已关闭。
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Jalen Chu 微信支付

微信支付

Jalen Chu 支付宝

支付宝

Jalen Chu 公众号

公众号