问题并不像标题中那样容易。
我在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时,它在/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。编辑:我可能已经找到了原因,但没有找到解释:当我删除JAVA_HOME的声明时,它使用默认的jvm并且服务启动被检测为“确定”,但是当我指定默认jvm的宿主时,它失败再次!
export JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"
要么 :
export JAVA_HOME="/usr/lib/jvm/java-8-oracle"
这是怎么回事?
最佳答案
这里是解释。
测试服务是否启动的命令不仅期望PID,而且还期望精确的Java二进制文件:
start-stop-daemon --test --start --pidfile "$CATALINA_PID" \
--user $TOMCAT7_USER --exec "$JAVA_HOME/bin/java" \
>/dev/null;
这将运行两次,一次在运行“ 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即可解决此问题。