【问题标题】:Webapp in Tomcat 6 cannot find environment variables after startTomcat 6中的Webapp启动后找不到环境变量
【发布时间】:2013-01-15 14:49:22
【问题描述】:

我有以下问题:

我正在使用 Tomcat 6.0.32 和 Java JDK 6.0_26。我已经安装成功,并且在浏览器的 8080 端口可以看到 Tomcat 的启动页面。

我还创建了 $CATALINA_HOME/setenv.sh 脚本,并在其中放入了一些特定于 webapp 的环境变量(以及 CATALINA_HOME、JAVA_HOME 和 CLASSPATH)。

我创建了一个新用户“tomcat”,为他设置了一个新的主目录,并对其进行了密码。

这个脚本来源于我创建的一个初始化脚本,用于在重启时自动启动和停止 Tomcat。我不使用 $CATALINA_HOME 中的标准 startup.sh 和 shutdown.sh,而是使用 jsvc daemon starter,因此我可以使用非 root 进程(Tomcat 本身)的 8080 端口。

实际的问题是,重启 Tomcat 后,我​​的 webapp 没有收到或看到我在 setenv.sh 中设置的环境变量,所以它不会启动。

我试过把环境变量定义放在各个地方:

  • tomcat主目录下的.bashrc
  • /etc/init.d/tomcat 脚本
  • $CATALINA_HOME/bin/setenv.sh
  • $CATALINA_HOME/webapps/myapp/META-INF/context.xml

无济于事,启动 Tomcat 后,我​​的 webapp 看不到所需的环境变量。

我的问题是 - 我到底在做什么?有什么建议吗?如果 setenv.sh 不起作用,我应该如何将环境变量传输到 webapp?是什么导致这种机制出现故障(据称这是将 env vars 交给 webapps 的方式)?

这是我写的启动脚本:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          allfaweb
# Required-Start:    $syslog $apache $apache2 $httpd
# Should-Start:
# Required-Stop:     $syslog $apache $apache2 $httpd
# Should-Stop:
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: ALLFAweb service
### END INIT INFO

ALLFAWEB_BIN=/install/apache-tomcat-6.0.32-allfaweb/bin/jsvc
test -x $ALLFAWEB_BIN || { echo "$ALLFAWEB_BIN not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

# Check for existence of setenv.sh file and read it
ALLFAWEB_CONFIG=/install/apache-tomcat-6.0.32-allfaweb/bin/setenv.sh
test -r $ALLFAWEB_CONFIG || { echo "$ALLFAWEB_CONFIG not existing";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 6; fi; }


. /etc/rc.status
rc_reset

. /install/apache-tomcat-6.0.32-allfaweb/bin/setenv.sh;


case "$1" in
    start)
        echo -n "Starting ALLFAweb ";
        $ALLFAWEB_BIN \
           -user tomcat \
           -home $JAVA_HOME \
           -Dcatalina.home=$CATALINA_HOME \
           -pidfile $ALLFAWEB_PID \
           -outfile $CATALINA_HOME/logs/catalina.out \
           -errfile $CATALINA_HOME/logs/catalina.err \
           -cp $CLASSPATH org.apache.catalina.startup.Bootstrap

        rc_status -v
        ;;
    stop)
        echo -n "Shutting down ALLFAweb "
        $ALLFAWEB_BIN \
            -stop \
            -pidfile $ALLFAWEB_PID \
            org.apache.catalina.startup.Bootstrap

        rc_status -v
        ;;
    restart)
        $0 stop
        $0 start
        rc_status
        ;;
    status)
        echo -n "Checking for service ALLFAweb ";
        /sbin/checkproc $ALLFAWEB_BIN
        rc_status -v
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
        ;;
esac
rc_exit

我使用的系统是 SUSE SP2:

# uname -a
Linux testmachine 3.0.51-0.7.9-default #1 SMP Thu Nov 29 22:12:17 UTC 2012  x86_64 x86_64 x86_64 GNU/Linux

任何帮助将不胜感激!在此先感谢:)

【问题讨论】:

  • 不需要root用户也可以在8080上启动tomcat
  • 你是说这个脚本在启动时可以正常工作,但之后就不行了?当您“重新启动” Tomcat 并且事情不起作用时,您如何重新启动 Tomcat?
  • 请注意,bin/setenv.sh 预计会从 bin/catalina.sh 调用。此时,CATALINA_HOMECATALINA_BASE 已经建立。调用bin/setenv.sh 后,bin/catalina.sh 将清除您设置的任何CLASSPATH。不管你如何解决这个问题,我建议你不要使用bin/setenv.sh来设置CATALINA_HOMECATALINA_BASECLASSPATH
  • @Christopher:init 脚本在启动后正常工作,之后我也可以启动/停止/重新启动它,我想多少次都可以。当我通过 jsvc 启动 Tomcat 时,我应该在哪里导出 CATALINA_HOME 和 CATALINA_BASE?直接作为参数传给jsvc?在那种情况下,我如何确保 setenv.sh 中的变量被导出到 webapp 的环境中?也许有一种使用 jsvc 导出自定义环境变量的特定方法,但我在 jsvc 命令行选项中没有找到任何相关信息。感谢您的反馈! :)
  • 对于 jsvc,您不需要 CATALINA_HOME 和 CATALINA_BASE:您可以在 start) 案例中使用 -D 参数将它们指定为参数。你到底想做什么?您的 webapp 是否尝试读取环境变量?为什么?

标签: java linux shell tomcat jsvc


【解决方案1】:

您应该使用系统属性而不是环境变量。检查 Tomcat 的 bin/daemon.sh 脚本的源代码,该脚本在启动时将所有标准变量传递给 Tomcat。

【讨论】:

  • 我在我的 Tomcat 6.0.32 安装目录中找不到 bin/daemon.sh。它是特定于版本的,还是我自己创建的?
  • 确认 - 当 apache 安装目录由 root 拥有(以及其中的所有文件),并且 Tomcat 由 root 用户启动(root 拥有 tomcat 进程)一切正常,webapp 得到它的环境变量。但是,如果 Tomcat 安装文件归我创建的用户所有,或者 Tomcat 容器由我创建的用户启动,则没有任何效果,我得到一个很好的旧 404 :) 那么运行 Tomcat 的标准方法是什么非root用户?
  • 看起来bin/daemon.sh 仅随 Tomcat 7 提供。这就是为什么我给你一个链接以便你阅读。
  • 我从来没有以 root 身份运行过 Tomcat,而且我从来没有遇到过任何问题。这是您第一次提到 404 响应。你能更清楚一点吗?这个问题似乎正在变成一项持续的咨询活动。
【解决方案2】:

我找到了。据称原因是起初我以 root 身份启动 Tomcat 6,然后 然后 将文件的所有权更改为用户“tomcat”。 root 进程以适当的权限在整个文件系统中写入了文件,即“tomcat”用户无法读取它们。

“tomct”用户的默认 shell 是 /bin/sh 而不是 /bin/bash

我还删除了 $CATALINA_HOME/work 中的文件,并重命名了我的自定义 env var 指向的目录(以及相应的 env var)。

在 / 目录中还有一些从 log4j 生成的日志文件,这些文件也消失了,现在一切都按预期工作了 :)

感谢您的所有反馈,在这 3 天的挫折中,您让我继续前进 :)

干杯!

【讨论】:

  • 感谢 kamaci 的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2017-11-03
  • 2016-07-11
相关资源
最近更新 更多