유닉스 서비스가 환경 변수를 볼 수있게하는 방법?


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

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


System 5 rc스크립트를 직접 호출 해도 시스템 운영 체제 에서도 작동하지 않습니다. 스크립트의 모든 호출은 systemctl숨겨진 후크 에 의해 호출 되기 때문입니다.
JdeBP

답변:


70

문제는 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

13
매우 도움이되었습니다. 감사합니다. 다른 리눅스 초보자들에게는 여기에 비밀스러운 Bash가 있습니다. [ ... ]조건부 테스트의 약자입니다. 이 답변을 참조하십시오 . 파일이 존재하는지 확인 -f하는 if인수입니다. &&단락 연산자입니다. 첫 번째가 0으로 종료되는 경우에만 두 번째 명령 만 수행하십시오. .source 또는 dot 연산자 : filename 인수에서 명령을 읽고 실행하십시오. 길이가 0 인 문자열을 확인 -z하는 if인수입니다. >&2stderr에 출력을 보냅니다. if 소개 도 참조하십시오 .
Mark Berry

@MarkBerry -f는의 일부가 [아닙니다 if.
Chris Down

@ChrisDown, 감사합니다. 따라서 " [ ... ]조건부 test명령 의 줄임말입니다 . 이 답변을 참조하십시오 . 파일이 있는지 확인 -f하는 test인수입니다."
Mark Berry

@MarkBerry 맞습니다. 다른 명령으로 생각할 수도 있습니다 [(또는 test) if. 종료 상태에 따라 조치를 취하는 것이 전부 입니다.
Chris Down

나는이 비슷한 상황으로 실행했습니다,하지만 필요하지 않은 $VAR초기화 스크립트로, 나는 2 ~ 3 통화를 다른 프로그램을 사용할 수 있어야 다운 스트림 초기화 스크립트. 예 : init 스크립트는 필요한 프로그램 2를 호출하는 프로그램 1 (Java)을 호출하는 start-stop-daemon을 호출합니다 $VAR. 이 답변에서 트릭을 시도했지만 내 상황에서는 작동하지 않는 것 같습니다. $VAR프로그램 2에서 사용할 수 있도록하려면 어떻게해야 합니까?
FrustratedWithFormsDesigner

1

내 경우에는, 내가 필요 RAILS_ENV로 한 것 /etc/bash.bashrc: export 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.