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

10

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

И у меня есть скрипт upstart в папке /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"

Что может быть проблемой здесь? Благодаря

    
задан megas 17.12.2013 в 21:52
источник

2 ответа

10

Прочтите это вопрос на 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="
    
ответ дан c0rp 22.12.2013 в 14:17
источник
8

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

env HOME=/home/MyName

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

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

#! /bin/bash

как линия 1. Тогда имеем

exec /path/to/my/script.sh
    
ответ дан Julian Stirling 20.12.2013 в 08:18