【问题标题】:service tomcat7 start fails, but the process exists and tomcat is runningservice tomcat7启动失败,但进程存在且tomcat正在运行
【发布时间】:2023-03-03 03:38:02
【问题描述】:

我一直在尝试使用apt-get install tomcat7 在 ubuntu docker 映像上安装 tomcat7。 安装工作正常,从 catalina.sh 启动 tomcat 也可以。

我需要从“service tomcat7 start”启动 tomcat,但失败了。 不管失败结果如何,如果我wget localhost:8080我可以看到tomcat应答,如果我ps -ef | grep tomcat我可以看到过程。

类似地,如果我运行service tomcat7 status,它会说即使它在运行并且 PID 文件确实存在,tomcat 也没有运行。

我注意到,当我从 catalina 脚本启动 tomcat 时,创建的 pid 文件名为 tomcat.pid,但 /etc/init.d/tomcat 脚本会尝试读取 tomcat7.pid。

但是,强制脚本中的名称查看正确的 pid 文件,并不能解决问题。

有其他人经历过吗?

我正在尝试的 docker 文件的 ubuntu 版本并不真正相关,因为我已经尝试了几个。

反正我最常用的是12.1014.04

谢谢!

【问题讨论】:

    标签: ubuntu tomcat7 docker


    【解决方案1】:

    我碰巧有一些情况,它是由删除/var/lib/tomcat7/logs目录引起的,我在其中重新制作了该目录,它由另一个用户拥有,所以tomcat7无法重新启动,也没有记录输出,我改变了自己,现在它工作正常。

    sudo chown tomcat7.tomcat7 /var/log/tomcat7
    sudo chown tomcat7.tomcat7 /var/lib/tomcat7/logs
    

    【讨论】:

      【解决方案2】:

      我遇到了这个。我通过将JAVA_HOME=/usr/lib/jvm/java-8-oracle 添加到/etc/default/tomcat7 来修复它(最终)。出于某种原因,它使用JAVA_HOME 来实际运行进程,但它使用/usr/lib/jvm/default-java 来检查进程是否正在运行。这让它感到困惑,因此它从未检测到该进程正在运行。

      【讨论】:

        【解决方案3】:

        在我使用的 docker Ubuntu 映像(5506de2b643b - 14.04.1 LTS)中,带有 --test 参数的 start-stop-daemon 工作不正确,并报告说 tomcat 没有运行,即使它正在运行。

        tomcat7 init.d 脚本启动 tomcat,因为start-stop-daemon --test 说(正确)tomcat 没有运行,但是在启动过程稍后它会检查 tomcat 是否成功启动并正在运行。 start-stop-daemon --test 现在错误地表示 tomcat 没有运行,这会导致 tomcat7 init.d 脚本删除 PID 文件。

        因此,service tomcat7 status 在tomcat 运行时会返回false,因为PID 文件已经消失,但由于start-stop-daemon --test 中的错误,即使PID 文件存在且PID 正确,它也会返回false。

        这是一个演示错误的示例会话:

        #TOMCAT PID IS 43
        root@a2cf26ade2a9:/# ps -eaf | grep tomcat7
        tomcat7     43     1  0 14:06 ?        00:00:04 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
        
        #PID FILE HAS CORRECT PID
        root@a2cf26ade2a9:/#  cat /var/run/tomcat7.pid
        43
        
        #START-STOP-DAEMON --TEST REPORTS THAT IT WOULD START TOMCAT
        root@a2cf26ade2a9:/#  start-stop-daemon --test --start --pidfile /var/run/tomcat7.pid --user tomcat7 --exec /usr/lib/jvm/java-7-oracle/bin/java
        Would start /usr/lib/jvm/java-7-oracle/bin/java .
        
        root@a2cf26ade2a9:/# echo $?
        0
        

        【讨论】:

        • 我刚刚在更改我正在使用的 Java 版本后遇到了这个错误。有解决办法吗?
        • 我在 github 上为 ubuntu 图像打开了一个问题:github.com/tianon/docker-brew-ubuntu-core/issues/27。还没有回应。一种解决方法是编写自己的 init.d 脚本,该脚本不使用-start-stop-daemon,或者直接使用 catalina.sh。
        【解决方案4】:

        Docker 不会启动任何 OS 服务,只会启动 Dockerfile 中给出的命令或在命令行中明确给出的命令。

        我的理解是service和相关命令依赖于一个不存在的init进程。

        您应该从 Catalina 脚本中显式地启动您的 tomcat。你可以用 supervisord 之类的东西来包装它,以获得“restart-if-it-crashes”行为。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-24
          • 1970-01-01
          • 2012-10-12
          相关资源
          最近更新 更多