如何让unix服务看到环境变量?

如何让unix服务看到环境变量?

我已经使用以下命令设置了环境变量/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删除除 之外的所有环境变量TERMPATHLANG是一件好事。如果您直接执行脚本,则不会删除环境变量,因此一切正常。

您不想依赖外部环境变量,因为在启动时环境变量可能不存在,并且您的初始化系统可能不会设置它。

如果您仍然想依赖此类变量,请获取文件并从中读取变量,例如/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.bashrcexport 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

相关内容