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