HOME переменная не установлена

12

У меня есть два сервера, они идентичны (я считаю), производственный и промежуточный серверы.

И у меня есть сценарий выскочки в /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"

В чем может быть проблема здесь? Спасибо

Мегас
источник
Я не знаю причину, но почему бы не установить это сначала, хотя статически?
Работа в
Почему громоздкий скрипт bash? Похоже, (да) sh будет интерпретировать это прекрасно.
Дэвид Фёрстер

Ответы:

11

Прочитайте этот вопрос на stackoverflow.com и этот ответ пользователя grawityна superuser.com

Вы не должны использовать $HOMEin 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="
c0rp
источник
8

Похоже, что $ HOME интерпретируется перед тем, как перейти к bash? Я бы попробовал одно из следующего. Либо добавьте:

env HOME=/home/MyName

к коду сразу после описания.

Или переместите код из блока скриптов в другой файл скрипта с помощью:

#! /bin/bash

как строка 1. Тогда есть

exec /path/to/my/script.sh
Джулиан Стерлинг
источник