유닉스 서비스가 환경 변수를 볼 수있게하는 방법? 주면/home/userhome 그러나이 변수에 대한 참조를 /etc/init.d/servicename파일에

다음을 사용하여 환경 변수를 설정했습니다 /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

유닉스 서비스가 환경 변수를 볼 수있게하려면 어떻게해야합니까?



답변

문제는 service스트립 모든 환경 변수를하지만 TERM, PATH그리고 LANG좋은 일이다. 스크립트를 직접 실행하는 경우 환경 변수가 제거되지 않으므로 모든 것이 작동합니다.

시작할 때 환경 변수가 존재하지 않고 init 시스템이 설정하지 않았기 때문에 외부 환경 변수에 의존하고 싶지 않습니다.

여전히 이러한 변수에 의존하려면 파일을 소싱하고 파일에서 변수를 읽으십시오 (예 /etc/default/servicename: 컨텐츠로 작성) .

VAR=value

다음과 같이 init 스크립트에서 제공하십시오.

[ -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

답변

내 경우에는, 내가 필요 RAILS_ENV로 한 것 /etc/bash.bashrc: export RAILS_ENV=staging. 추가 $(grep RAILS_ENV /etc/bash.bashrc)하고 스크립트에서 변수를 사용할 수있게했습니다. 이 방법으로 파일의 나머지 부분을 포함시킬 필요가 없었습니다.


답변

또한 작동하는 하나의 못생긴 솔루션 :

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