启动后,Tomcat 6中的Webapp无法找到环境变量

时间:2013-01-15 14:49:22

标签: java linux shell tomcat jsvc

我有以下问题:

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

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

我创建了一个新用户“tomcat”,为他设置了一个新的主目录,并且还传递了它。

此脚本来自我创建的init脚本,用于在重新启动时自动启动和停止Tomcat。我不使用$ CATALINA_HOME中的standart startup.sh和shutdown.sh,而是使用jsvc守护程序启动程序,因此我可以从非root进程(Tomcat本身)使用端口8080。

实际问题是,重新启动Tomcat后,我的webapp没有收到或看到我在setenv.sh中设置的环境变量,因此无法启动。

我试图将环境变量定义放在不同的地方:

    tomcat主目录中的
  • .bashrc
  • /etc/init.d/tomcat script
  • $ CATALINA_HOME /斌/ setenv.sh
  • $ CATALINA_HOME / web应用/ MyApp的/ META-INF / context.xml中

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

我的问题是 - 我在做什么?有什么建议吗?如果setenv.sh不起作用,我应该如何将env变量转移到webapp?什么可能使这个机制出错(据称这是将env vars交给webapps的方式)?

这是启动脚本I Worte:

#!/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

任何帮助都将受到高度赞赏!在此先感谢:)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

在/ dicrectory中也有一些log4j生成的日志文件,它们也已经消失了,现在一切都按预期工作了:)

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

干杯!