두 대의 서버가 있습니다. 프로덕션 서버와 준비 서버는 동일합니다.
그리고 /etc/init/
폴더에 시작 스크립트가 있습니다.
description "Discoure process"
setuid deploy
setgid deploy
respawn
respawn limit 3 30
start on runlevel [2345]
stop on runlevel [06]
script
exec /bin/bash <<'EOT'
echo \"$HOME/.rbenv\"
cd /home/deploy/discourse/current
bundle exec bluepill load config/discourse.pill --no-privileged --base-dir tmp/bluepill --logfile log/bluepill.log
EOT
end script
준비 서버에서는 잘 작동하지만 프로덕션 서버에서 해당 스크립트를 실행하면 HOME 변수가 비어 있으며 코드 echo "$HOME/.rbenv"
는"/.rbenv"
여기서 문제가 될 수있는 것은 무엇입니까? 감사
답변
stackoverflow.com 에서이 질문을 읽고 superuser.com에서 사용자 가이 답변 을 읽습니다.grawity
당신은 사용하지 말아야 $HOME
에서 init.d
는이 사용자가 로그인 할 때까지 사용에 대한 사용자의 홈 명확하지 않기 때문에.
POSIX 사양 에서 인용 :
HOME
The system shall initialize this variable at the time of login to be a pathname
of the user's home directory. See <pwd.h>.
당신은 myuser
당신의 스크립트 에 사용자의 홈 폴더를 얻기 위해 작은 해킹을 사용할 수 있습니다
su - myuser -c /usr/bin/env | grep HOME
일반적으로 다른 HOME_*
폴더 가있을 수 있으므로 아래 스크립트를 사용하는 것이 좋습니다 . 예컨대 JAVA_HOME
등등
su - myuser -c /usr/bin/env | grep "^HOME="
답변
bash로 가기 전에 $ HOME이 해석되는 것처럼 보입니까? 다음 중 하나를 시도합니다. 다음을 추가하십시오.
env HOME=/home/MyName
설명 바로 뒤에 코드에.
또는 다음을 사용하여 스크립트 블록 내부에서 다른 스크립트 파일로 코드를 이동하십시오.
#! /bin/bash
1 행으로
exec /path/to/my/script.sh