我已经使用以下命令设置了环境变量/etc/profile
:
export VAR=/home/userhome
然后如果我echo $VAR
这样做就会显示/home/userhome
但是当我将对这个变量的引用放入文件中时/etc/init.d/servicename
,它找不到这个变量。当我service servicename status
使用/etc/init.d/servicename
包含以下内容的文件运行时:
case "$1" in
status)
cd $VAR/dir
;;
esac
它说/dir: No such file or directory
但如果我跑步/etc/init.d/servicename status
而不是service servicename status
如何让unix服务看到环境变量?
答案1
问题是service
删除除 之外的所有环境变量TERM
,PATH
这LANG
是一件好事。如果您直接执行脚本,则不会删除环境变量,因此一切正常。
您不想依赖外部环境变量,因为在启动时环境变量可能不存在,并且您的初始化系统可能不会设置它。
如果您仍然想依赖此类变量,请获取文件并从中读取变量,例如/etc/default/servicename
使用以下内容创建:
VAR=value
并从您的初始化脚本中获取它,例如:
[ -f /etc/default/service-name ] && . /etc/default/service-name
if [ -z "$VAR" ] ; then
echo "VAR is not set, please set it in /etc/default/service-name" >&2
exit 1
fi
case "$1" in
status)
cd "$VAR"/dir
;;
esac
答案2
就我而言,我需要在:RAILS_ENV
中设置一个。我添加了该变量,这使得该变量可用于脚本。我这样做了,所以我不必包含文件的其余部分。/etc/bash.bashrc
export RAILS_ENV=staging
$(grep RAILS_ENV /etc/bash.bashrc)
答案3
一丑陋的也有效的解决方案:
function exec() {
args=( $@ )
command=${args[0]}
dummy=${args[1]}
whoami=`whoami`
if [ -z "$dummy" ]; then
me=`basename $0`
runuser -l ${whoami} -c "bash /etc/init.d/${me} ${command} dummy"
else
printenv
fi
}
case $1 in
status)
status
;;
start|stop|kill|restart)
exec $*
;;
*)
usage
esac