我有两台服务器,它们是相同的(我相信),生产服务器和暂存服务器。
我的/etc/init/
文件夹中有 upstart 脚本。
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"
这里可能存在什么问题?谢谢
答案1
读这个stackoverflow.com 上的问题和这个答案grawity
由superuser.com 上的用户发布
您不应该使用$HOME
in 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
etc。
su - myuser -c /usr/bin/env | grep "^HOME="
答案2
好像 $HOME 在进入 bash 之前被解释过?我会尝试以下方法之一。添加:
env HOME=/home/MyName
描述之后的代码。
或者使用以下命令将代码从脚本块内部移动到另一个脚本文件:
#! /bin/bash
如第 1 行所示。然后有
exec /path/to/my/script.sh
答案3
如果您所需要的只是HOME
设置变量(这解决了我的问题),则可以使用指令明确设置它env
:
env HOME=/home/user