setenv.sh导致Tomcat7“失败”启动

时间:2016-12-13 15:53:12

标签: java tomcat tomcat7

问题并不像标题中那么容易。

我在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。

编辑:我可能找到原因而不是解释:当我删除JAVA_HOME的声明时,它使用默认的jvm并且服务启动被检测为“OK”,但是当我指定默认的jvm的主页时,它又失败了!

export JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"

或:

export JAVA_HOME="/usr/lib/jvm/java-8-oracle"

这里发生了什么?

1 个答案:

答案 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解决问题。