如何使Unix服务查看环境变量?


52

我使用以下命令设置了环境变量/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服务查看环境变量?


请注意,rc直接调用System 5 脚本在systemd操作系统上不会以这种方式进行操作,因为该脚本的所有调用都被systemctl隐藏的钩子转换为。
JdeBP

Answers:


70

问题是service去除所有的环境变量,但是TERMPATHLANG这是一件好事。如果直接执行脚本,则不会删除任何环境变量,因此一切正常。

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

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

13
非常有帮助,谢谢。对于其他Linux新手,这是神秘的Bash东西。[ ... ]是条件测试的简写;看到这个答案-fif检查文件是否存在的参数。&&是一个短路运算符:仅当第一个以0退出时才执行第二个命令。source .或dot运算符:从filename参数读取并执行命令。-zif检查零长度字符串的参数。 >&2将输出发送到stderr。另请参见if简介
Mark Berry 2014年

@MarkBerry -f是的一部分[,而不是if
克里斯·唐尼

@ChrisDown,谢谢。因此,“ [ ... ]是条件test命令的简写;请参阅此答案-ftest检查文件是否存在的参数”。
马克·贝里

@MarkBerry正确。您可以将[(或test)视为另一个命令- if所做的只是根据退出状态采取一些措施。
克里斯·

我遇到了类似的情况,但是我不需要$VAR进入init脚本,我需要它可用于init脚本下游的2或3个不同的程序。例如。init脚本调用start-stop-daemon,该守护程序调用程序1(Java),该程序调用需要的Program 2 $VAR。我尝试了此答案中的技巧,但在我的情况下似乎不起作用。我如何确保$VAR将其提供给计划2?
FrustratedWithFormsDesigner 2015年

1

就我而言,我需要RAILS_ENV的是在设置/etc/bash.bashrcexport RAILS_ENV=staging。我添加$(grep RAILS_ENV /etc/bash.bashrc)了该变量并使该变量可用于脚本。我这样做的方式是,所以我不必包括文件的其余部分。


-1

一个丑陋的解决方案也将起作用:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.