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