Назад | Перейти на главную страницу

Запуск сценария запуска оболочки для приложения ruby ​​от имени другого пользователя (не root)

Я установил RVM с помощью user01 в Ubuntu 14.04, и user01 может запустить мое приложение rails, как и ожидалось. Однако я хочу запустить это приложение после запуска системы. Для этого я пытаюсь использовать следующее:

/var/script/start.sh

screen -d -m mongrel_rails start -e production -p 8088

/etc/rc.local (добавлено перед выходом 0)

sh './var/script/start.sh'

Из-за приведенных выше изменений мое приложение rails не запускается. Я могу подтвердить это, потому что нет активного сеанса экрана GNU (команда screen -d -m mongrel_rails ... запускает сеанс экрана и отключается. Я могу увидеть сеанс с помощью команды "screen -ls", но я даже после переключения на root).

Я переключился на root (sudo su) и попытался запустить приложение вручную, но это не удалось:

/ usr / bin / env: ruby: нет такого файла или каталога

Я подумал, что RVM / Ruby не работает для root. Я подтвердил это, запустив «ruby -v», который вернул сообщение, подтверждающее, что приложение не было установлено. Это не тот случай, когда user01 видит информацию об установленной версии ruby.

Я продолжал искать способ обойти это и нашел эта почта который предложил следующую команду для переключения на пользователя при выполнении команды запуска.

su user01 -c '/var/script/start.sh'

Это тоже не помогло, и после расследования я обнаружил, что ruby ​​был сломан для user01, когда я «su user01» в эту учетную запись от root. 'ruby -v' также не вернул ожидаемую информацию. После тестирования вручную я обнаружил, что ввод «exit» вернул меня в root, а другой «exit» вернул меня на user01 (учетная запись, которую я использовал для входа в систему), и ruby ​​правильно работает для этой учетной записи.

Может ли кто-нибудь предложить способ обойти это?

Вы используете rvm, поэтому правильный способ справиться с тем, что рубин не найден, - это использовать обертку rvm (в системах SysVinit и upstart).

Сначала (необязательно) создайте псевдоним для вашего приложения для gemset, который вы хотите использовать:

rvm alias create my_app ruby-2.1.4@my_gemset

Затем создайте нужную оболочку (и):

rvm wrapper my_app mongrel_rails

Обертка создается в $rvm_path/wrappers/my_app каталог, а затем вы вызываете его из своего сценария инициализации после переключения пользователей.

su user01 -c '/home/user01/.rvm/wrappers/my_app/mongrel_rails -e production -p 8088'

(Обратите внимание, что я полностью удалил screen отсюда, так как нет особых причин запускать это на экране.)

Если '/var/script/start.sh' работает, когда вы запускаете его под именем user01, тогда ваш сценарий зависит от переменных среды. Чтобы увидеть эти переменные, запустите env. Возможно, что-то не хватает, когда вы пытаетесь запустить его из учетной записи root через su user01 -c.

Я бы посоветовал попробовать использовать специальную опцию '-' с su. На странице руководства:

       -, -l, --login
              make  the  shell a login shell, clears all envvars except
              for TERM, initializes HOME, SHELL, USER, LOGNAME and PATH

Итак, ваша команда будет выглядеть так:

# su - user01 -c '/var/script/start.sh'

Таким образом, user01 сделает оболочку оболочкой входа в систему, очистит envvars и инициализирует все остальное, как указано на странице руководства.