Tomcat servlet 引擎未运行,但存在 pid 文件。这条消息是啥意思?如果我得到它,我需要恢复 Tomcat 吗?

Posted

技术标签:

【中文标题】Tomcat servlet 引擎未运行,但存在 pid 文件。这条消息是啥意思?如果我得到它,我需要恢复 Tomcat 吗?【英文标题】:Tomcat servlet engine is not running, but pid file exists. What does this message mean? Do I need to recover Tomcat if I get it?Tomcat servlet 引擎未运行,但存在 pid 文件。这条消息是什么意思?如果我得到它,我需要恢复 Tomcat 吗? 【发布时间】:2012-08-02 11:10:53 【问题描述】:

我正在制作一个 shell 脚本来在崩溃后重新启动 tomcat。 我想知道我需要在我的脚本“Tomcat servlet 引擎未运行,但 pid 文件存在”中处理此消息。 这条消息是什么意思? 我是否需要将其视为强制我重新启动 Tomcat 的错误消息?

我的脚本如下:

#!/bin/bash
SERVICE=/etc/init.d/tomcat7
STOPPED_MESSAGE=" * Tomcat servlet container is not running."  
PID_FILE_MESSAGE=" * Tomcat servlet engine is not running, but pid file exists."

if [ "`$SERVICE status`" == "$STOPPED_MESSAGE" ];
then  

    $SERVICE start

else
    if [ "`$SERVICE status`" == "$PID_FILE_MESSAGE" ];
    then
    
        $SERVICE restart
    
    fi
fi

【问题讨论】:

您应该查看退出代码,而不是文本输出。 谢谢@jordanm,你能发布一个我们如何查看退出代码的例子吗? $SERVICE status; if (( $? == 0 )); then echo "running"; fi。如果您使用的是 Linux,LSB 定义应提供哪些退出代码:refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/… 【参考方案1】:

这是PID 的定义。 PID 文件是包含进程标识符的文件。如果Tomcat的启动脚本是在CATALINA_PID环境变量设置正确的情况下运行的,那么Tomcat进程的PID会在启动时记录到一个文件中。如果在您尝试启动 Tomcat 时该文件存在,脚本将拒绝运行,因为它不想破坏(可能是有效的)PID 文件。

如果您确定 Tomcat 没有运行,只需删除该文件(它应该可以通过 CATALINA_PID 环境变量获得)并重试。

我分享了@jordanm 关于使用退出代码而不是检查特定(文本)输出的评论:最新版本的 Tomcat 甚至不使用您上面显示的消息,所以它非常脆弱。

如果您想要一个自启动服务,请考虑查看jsvc,它实际上以源代码形式随 Tomcat 二进制文件一起提供。

【讨论】:

感谢 Christopher 的回答,但我想知道为什么“Tomcat servlet 引擎未运行”但“可能存在有效的 PID 文件”?这种情况什么时候发生?如果我收到这条消息,我该怎么办? 请重新阅读我的回答:它为您(重新)在评论中提出的两个问题提供了答案。 谢谢克里斯托弗,请原谅我的快速反应。【参考方案2】:

当我重新启动 tomcat 时,我遇到了同样的问题。我还在 cataline.out 日志文件中找到了“java.net.BindException:无法分配请求的地址”。

Soultion: 使用killall -9 java 杀死所有java pid,然后重新启动tomcat

对我来说问题已经解决了

【讨论】:

以上是关于Tomcat servlet 引擎未运行,但存在 pid 文件。这条消息是啥意思?如果我得到它,我需要恢复 Tomcat 吗?的主要内容,如果未能解决你的问题,请参考以下文章

web.xml - Java Servlet 过滤器 - 在处理 JSP 页面之前未运行(在 Tomcat 上)

Servlet

jsp页面被tomcat引擎运行的时候组装成java片段,但是这些java片段怎么没有main方法作为程序的入口啊?

Jetty 与 Tomcat 的比较

如果 WEB-INF/classes 目录存在,Tomcat 服务器将不会启动

Java编程中出现javax.servlet.*类不存在怎么解决