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

val*_*ina 13 ubuntu tomcat7 docker

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

我需要从"service 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.1014.04.

谢谢!

lre*_*der 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文件已经消失,但即使PID文件由于错误导致PID文件正确,它也会返回false start-stop-daemon --test.

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

#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
Run Code Online (Sandbox Code Playgroud)

  • 我在github上为ubuntu映像打开了一个问题:https://github.com/tianon/docker-brew-ubuntu-core/issues/27.还没有回复.一种解决方法是编写自己的init.d脚本,该脚本不使用-start-stop-daemon,或者直接使用catalina.sh. (2认同)

Abe*_*iño 0

Docker 不会启动任何操作系统服务,只会启动 Dockerfile 中给出的命令或在命令行中显式给出的命令。

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

您应该从 Catalina 脚本显式启动 tomcat。您可以用类似supervisord 的东西包装它来获得“如果崩溃则重新启动”行为。