setenv.sh 导致 Tomcat7 "fail" 启动

setenv.sh causing Tomcat7 to "fail" start

问题并不像标题中的那么简单

我在 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 没有错误,但服务被检测为 "failed" 当 /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    

还有一个问题,可能是相关的:当我在启动后检查进程 运行 时检测到 "failed" (ps -ef | grep java),我可以看到添加的所有 -D 选项setenv.sh,但我看不到 "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"

这里发生了什么?

这里有解释。

测试服务是否启动的命令不仅需要 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 上的 "standard" tomcat conf 是这样工作的:/etc/init.d/tomcat7 可以被 /etc/default/tomcat7 覆盖被 catalina.sh 覆盖(+ setenv.sh + appenv.sh)。

所以有 运行 有 2 个不同的 JAVA_HOME,第一个与 /etc/default/tomcat7 中的那个或一些自动检测到的那个,第二个与 [=] 中设置的那个38=]。这使得启动停止守护进程测试失败。

解决方案是设置 JAVA_HOME 两次,一次在 /etc/default/tomcat7 用于服务启动,一次在 setenv.sh 以防某些直接启动(通过 startup.sh在 shell) 中需要完成以用于测试目的,一些评论警告重复。

关于 appenv.sh,原因是 CATALINA_BASE == CATLINA_HOME 只有当您从命令行 (startup.sh) 启动 Tomcat 时。当 运行ning Tomcat 作为服务时 CATALINA_BASE = /var/lib/tomcat7 while $CATALINA_HOME = /usr/share/tomcat7.

所以将setenv.sh(和appenv.sh)放在/var/lib/tomcat7/bin/而不是/usr/share/tomcat7/bin 中解决了问题。