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

Запуск скрипта оболочки запуска для приложения 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 (команда screen -d -m mongrel_rails... запускает сеанс screen и отсоединяется. Я должен видеть сеанс с помощью команды "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 ​​работает правильно для этой учетной записи.

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

решение1

Вы используетервм, поэтому правильный способ справиться с тем, что рубин не найден, — этоиспользовать обертку 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от этого, поскольку нет особых причин запускать это на экране.)

решение2

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

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

       -, -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 сделает оболочку оболочкой входа, очистит переменные окружения и инициализирует все остальное, как сказано в справочной странице.

Связанный контент