【问题标题】:setenv.sh causing Tomcat7 to "fail" startsetenv.sh 导致 Tomcat7 “失败”启动
【发布时间】:2016-12-13 15:53:11
【问题描述】:

问题并不像标题中看起来那么简单。

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

这里发生了什么?

【问题讨论】:

    标签: java tomcat tomcat7


    【解决方案1】:

    这里是解释。

    测试服务是否启动的命令不仅需要 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 覆盖,而 /etc/default/tomcat7 可以被 catalina.sh 覆盖(+ setenv.sh + appenv.sh )。

    所以有 2 个不同的 JAVA_HOME 运行,第一个使用 /etc/default/tomcat7 中的一个或自动检测到的一个,第二个使用 setenv.sh 中设置的一个。这会使 start-stop-daemon 测试失败。

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2011-09-27
      • 2014-12-27
      • 1970-01-01
      • 2014-09-08
      • 2019-02-17
      相关资源
      最近更新 更多