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

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

当我在中创建启动脚本/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   

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

$CATALINA_HOME但是如果我在 URL 中使用相对 URL,则url="jdbc:h2:file:$CATALINA_HOME\webapps\myDB;SCHEMA=mySchema"此方法不起作用,并且会出现 JNDI 异常。
请注意,在我的脚本中,我已导出$CATALINA_HOME/home/apache-tomcat-7.0.25

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

答案1

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

某些程序(例如)su/sudo会根据调用方式对环境进行一些过滤,作为一种安全措施。因此,您的 init 脚本正在调用su正在启动的$CATALINA_HOME/bin/startup.sh,我猜这实际上是在执行 Tomcast 启动。某些东西可能正在删除或忽略变量。

我确实想知道为什么您要在 init 脚本中调用 using su root。默认情况下,Init 脚本以 root 身份运行,因此您没有理由需要再次成为 root。如果我是您,我会放弃似乎毫无意义的调用su

只是为了帮助您排除故障。在 Linux 上,以 root 身份挂载后/proc,您可以查看当前环境。

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

相关内容