Проблема с развертыванием Ruby RVM и daemontools

#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», чтобы найти его местоположение).