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

我一直在尝试在apt-get install tomcat7上安装Ubuntu的Docker镜像上的apt-get install tomcat7 。 安装工作正常,并从catalina.sh启动tomcat。

我需要从“service tomcat7 start”启动tomcat,而不是。 不pipe失败的结果,如果我wget localhost:8080我可以看到tomcat回答,如果我ps -ef | grep tomcat ps -ef | grep tomcat我可以看到这个过程。

同样,如果我运行service tomcat7 status它说,即使它是和PID文件确实存在,tomcat不运行。

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

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

有没有人经历过这个?

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

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

谢谢!

在我使用的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文件。

因此,当tomcat运行时, service tomcat7 status返回false,因为PID文件不存在,但由于start-stop-daemon --test的错误,即使PID文件存在正确的PID,它也将返回false。

这里是一个演示bug的示例会话:

 #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 

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

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

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

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

我碰巧遇到了一些情况,这是由于删除了/var/lib/tomcat7/logs目录,我在那里重新制作了目录,它由另外一个用户拥有,这样tomcat7不能重启,而不是日志输出,我改了自己的,现在它工作正常。

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