У меня есть два сервера, они идентичны (я считаю), производственные и промежуточные серверы.
И у меня есть скрипт выскочки в папке /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 и этот ответ пользователем grawity
на superuser.com
Вы не должны использовать $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="
Похоже, что $ HOME интерпретируется перед переходом в bash? Я бы попробовал одно из следующего. Либо добавьте:
env HOME=/home/MyName
к коду сразу после описания.
Или переместите код из блока сценария в другой файл сценария с:
#! /bin/bash
в качестве строки 1. Затем введите
exec /path/to/my/script.sh