如果我在启动脚本中导出环境变量,它是否会持续存在?

Jim*_*Jim 3 linux java opensuse tomcat

当我在其中创建一个启动脚本/etc/init.d并执行export一个变量时,这个变量是否持续存在并且对启动的进程“可见”?
具体来说,我有以下脚本在 init.d 中启动 tomcat,我手动启动start

#!/bin/bash
RETVAL=$?
export JRE_HOME=/home/jre
export PATH=/home/jre/bin/:${PATH}
export CATALINA_HOME=/home/apache-tomcat-7.0.25
case "$1" in
 start)
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
            /bin/su root $CATALINA_HOME/bin/startup.sh
        fi
        ;;
 stop)
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
            /bin/su root $CATALINA_HOME/bin/shutdown.sh
        fi
        ;;
 restart)
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
            /bin/su root $CATALINA_HOME/bin/shutdown.sh
        fi
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
            /bin/su root $CATALINA_HOME/bin/startup.sh
        fi
        ;;        
 *)
        echo $"Usage: $0 {start|stop}"
        exit 1
        ;;
esac
exit $RETVAL   
Run Code Online (Sandbox Code Playgroud)

现在在 Tomcat 中我使用连接池,当我使用绝对 url 时,一切正常。IE:url="jdbc:h2:file:/home/apache-tomcat-7.0.25/webapps/myDB;SCHEMA=mySchema"

但是,如果我$CATALINA_HOME在 url 中使用相对 url ie ,即url="jdbc:h2:file:$CATALINA_HOME\webapps\myDB;SCHEMA=mySchema"这不起作用,我会收到 JNDI 异常。
请注意,在我的脚本中,我已导出$CATALINA_HOME/home/apache-tomcat-7.0.25

似乎$CATALINA_HOME没有为 Tomcat 的启动实例设置。
可能是这种情况吗?任何人都知道为什么带有环境变量的 url 不起作用?

Zor*_*che 6

创建新进程时,环境从父进程复制。因此,您在启动另一个进程之前在脚本中设置的任何环境变量都应该存在。

su/sudo作为一种安全措施,一些程序会根据它们的调用方式对环境进行一些过滤。所以你的 init 脚本正在调用suwhich is starting $CATALINA_HOME/bin/startup.sh,我猜它实际上是在做 Tomcast 启动。有些东西可能正在删除或忽略变量。

我确实想知道您为什么su root从 init 脚本中调用 using 。默认情况下,初始化脚本以 root 身份运行,您应该没有理由需要再次成为 root 用户。如果我是你,我会放弃似乎毫无价值的电话su

只为帮你排忧解难。作为 root,在 Linux 上,当您/proc挂载后,您可以查看当前的环境。

例如,如果 tomcat 的进程 ID 为 1234,那么您需要查看/proc/1234/environ. 任何设置的东西都应该在那里。