问题并不像标题中那么容易。
我在Unbutu 14.04 LTS上使用默认的Tomcat 7软件包。当我在/ usr / share / tomcat7 / bin中没有“setenv.sh”时,它会在我这样做时开始说“OK”:
$ sudo service tomcat7 start
* Starting Tomcat servlet engine tomcat7 [OK]
当我使用下面描述的setenv.sh时, ALSO STARTS 在/var/lib/logs/catalina.out中没有错误,但是当/ etc /时服务被检测为“失败” init.d / tomcat7调用“start-stop-daemon --test”并断定它没有运行:
$ sudo service tomcat7 start
* Starting Tomcat servlet engine tomcat7 [fail]
我该怎么办?
/usr/share/tomcat7/bin/setenv.sh:
#! /bin/sh
export JAVA_HOME="/home/linc/install/jdk1.7.0_75"
(...)
# Check for application specific parameters at startup
if [ -r "$CATALINA_BASE/bin/appenv.sh" ]; then
. "$CATALINA_BASE/bin/appenv.sh"
fi
还有一个问题,可能是相关的:当我检测到启动被检测为“失败”(ps -ef | grep java
)后运行时,我可以看到setenv.sh添加的所有-D选项,但我可以看不到“appenv.sh”添加的-D选项(虽然setenv.sh和appenv.sh具有完全相同的755权限。)
注意:如果我启动sudo /usr/share/tomcat7/bin/startup.sh
,则setenv.sh不会导致任何问题,并且会使用appenv.sh。
export JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"
或:
export JAVA_HOME="/usr/lib/jvm/java-8-oracle"
这里发生了什么?
答案 0 :(得分:0)
以下是解释。
命令测试服务是否启动或者不仅仅检测PID而且还检测精确的java二进制文件:
start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
--user $TOMCAT7_USER --exec "$JAVA_HOME/bin/java" \
>/dev/null;
这是运行2次,一次在" catalina.sh" (和setenv.sh)运行一次。
"标准" ubuntu上的tomcat conf的工作原理如下:/etc/init.d/tomcat7可以被/ etc / default / tomcat7覆盖,可以被catalina.sh(+ setenv.sh + appenv.sh)覆盖。
所以有两个不同的JAVA_HOME运行,第一个用/ etc / default / tomcat7中的一个或一些自动检测到的一个,第二个用setenv.sh中设置的一个。这使得start-stop-daemon测试失败。
解决方案是将JAVA_HOME设置两次,一次在/ etc / default / tomcat7中用于服务启动,另一次在setenv.sh中,以防一些直接启动(通过shell中的startup.sh)需要进行测试目的,有一些评论警告重复。
关于appenv.sh,只有从命令行(startup.sh)启动Tomcat时,原因才是CATALINA_BASE == CATLINA_HOME。将Tomcat作为服务CATALINA_BASE = / var / lib / tomcat7运行时,$ CATALINA_HOME = / usr / share / tomcat7。
所以把setenv.sh(和appenv.sh)放在/ var / lib / tomcat7 / bin /而不是/ usr / share / tomcat7 / bin解决问题。