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

Ubuntu 服务tomcat7启动失败,但进程存在并且tomcat正在运行,ubuntu,tomcat7,docker,Ubuntu,Tomcat7,Docker,我一直在尝试在ubuntu docker镜像上安装tomcat7,使用apt get install tomcat7。 安装工作正常,从catalina.sh启动tomcat也正常 我需要从“服务tomcat7启动”启动tomcat,但它失败了。 不管故障结果如何,如果我wget localhost:8080我可以看到tomcat应答,如果我ps-ef | grep tomcat我可以看到过程 类似地,如果我运行服务tomcat7 status,它会说tomcat没有运行,即使在运行时,PID文

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

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

类似地,如果我运行
服务tomcat7 status
,它会说tomcat没有运行,即使在运行时,PID文件确实存在

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

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

还有其他人经历过吗

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

无论如何,我最常用的是12.1014.04


谢谢

Docker不启动任何操作系统服务,只启动Dockerfile中给出的命令或命令行中明确给出的命令

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


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

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

tomcat7 init.d脚本启动tomcat是因为
start-stop-daemon--test
正确地说tomcat没有运行,但在启动过程的稍晚一点,它会检查tomcat是否成功启动并正在运行
start-stop守护进程--test
现在错误地说tomcat没有运行,这导致tomcat7 init.d脚本删除PID文件

因此,
服务tomcat7 status
在tomcat运行时返回false,因为PID文件已丢失,但由于
启动停止守护程序--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

我遇到了这个。我(最后)通过将
JAVA\u HOME=/usr/lib/jvm/JAVA-8-oracle
添加到
/etc/default/tomcat7
中来修复它。出于某种原因,它使用
JAVA\u 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

我只是在更改了我正在使用的Java的构建之后遇到了这个bug。有解决方案吗?我在github上为ubuntu映像打开了一个问题:。还没有回应。一种解决方法是编写自己的init.d脚本,它不使用start-stop守护进程,或者直接使用catalina.sh。