#ruby #rvm
#ruby #rvm
Вопрос:
Я использую daemontools в рабочей среде для поддержания работоспособности сервисов и хочу запустить сервер Ruby, а не Rails, и без RVM он работает хорошо, но с RVM у меня есть некоторые проблемы.
Моя цель — запустить процесс с правами root, заставить его отказаться от прав root, чтобы получить права другого пользователя, а затем запустить процесс Ruby с RVM и указанной версией Ruby.
Вот сценарий запуска, который я использовал до сих пор:
#!/bin/sh
exec 2>amp;1
cd /app/src
. /usr/local/rvm/scripts/rvm
rvm use 1.9.1-p378
exec setuidgid app_user ruby main.rb
Этот скрипт работает, но у setuidgid есть серьезная проблема: приложение будет запускаться пользователем <x>
и группой <x>
, и только этой группой. Если пользователь находится в других группах, у процесса не будет их прав.
Итак, это привело меня к другому подходу:
#!/bin/sh
exec 2>amp;1
cd /app
exec sudo -u app_user rvm 1.9.1-p378 exec ruby main.rb
Это работает нормально, за исключением того, что это процесс RVM, который порождается daemontools, и он не реагирует, когда получает SIGTERM, что на самом деле не очень приятно. По сути, это означает, что службу нельзя перезапустить вручную, что нехорошо.
Ответ №1:
Я нашел ответ, но, взглянув на скрипт rvmsudo, установленный с rvm, вот рабочий скрипт запуска:
#!/bin/sh
# redirect stderr to stdout
exec 2>amp;1
cd /app
# load rvm
. /usr/local/rvm/scripts/rvm
# select ruby version for this application
rvm use 1.9.1
# # depending on your configuration you may need to provide the absolute path to rvm, like that:
# /usr/local/bin/rvm use 1.9.1
# build the exec command line preserving the rvm environment
command="exec sudo -u app_user /usr/bin/env PATH='$PATH'"
[[ -n "${GEM_HOME:-}" ]] amp;amp; command="${command} GEM_HOME='$GEM_HOME' "
[[ -n "${GEM_PATH:-}" ]] amp;amp; command="${command} GEM_PATH='$GEM_PATH' "
# this is where your real command line goes
command="${command} ruby main.rb"
# run the application
eval "${command}"
Комментарии:
1. К сожалению, я получаю «/ usr/ bin/ env: rvm: такого файла или каталога нет». Есть какие-нибудь указания?
2. rvm может отсутствовать в ПУТИ при запуске daemontools, вы можете попытаться заменить «rvm использовать 1.9.1» на абсолютный путь к rvm, что-то вроде: «/usr/local/bin / rvm использовать 1.9.1» (используйте «какой rvm», чтобы найти его местоположение).