服务tomcat7启动失败,但进程存在且tomcat正在运行

时间:2014-06-27 11:46:05

标签: ubuntu tomcat7 docker

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

我需要从服务tomcat7 start"启动tomcat,然后失败。 无论失败结果如何,如果我wget localhost:8080我可以看到tomcat回答,如果我ps -ef | grep tomcat我可以看到该过程。

同样,如果我运行service tomcat7 status,它表示tomcat没有运行,即使它存在并且 PID 文件确实存在。

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

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

还有其他人经历过这个吗?

我正在尝试的docker文件的ubuntu版本并不真正相关,因为我一直在试用几个。

无论如何,我主要使用的是 12.10 14.04

谢谢!

4 个答案:

答案 0 :(得分:7)

在我正在使用的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

答案 1 :(得分:0)

Docker不启动任何OS服务,只启动Dockerfile中给出的命令或显式命令行。

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

你应该从Catalina脚本中明确地启动tomcat。你可以用supervisord之类的东西来包装它,以获得“重启 - 如果它崩溃”的行为。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我遇到了一些情况,它是由删除/var/lib/tomcat7/logs目录引起的,我重新创建了目录,它由另一个用户拥有,因此tomcat7无法重启,而不是日志输出,I改变自己,现在工作正常。

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