当我在中创建启动脚本/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
。设置的任何内容都应该在那里。