Я использую daemontools на производстве, чтобы поддерживать работоспособность сервисов, и хочу запустить сервер Ruby, а не Rails, и без RVM он работает хорошо, но с RVM у меня есть некоторые проблемы.
Моя цель - запустить процесс с правами root, заставить его отказаться от прав root, чтобы получить права другого пользователя, а затем запустить процесс Ruby с RVM и указанной версией Ruby.
Вот скрипт запуска, который я использовал до сих пор:
#!/bin/sh
exec 2>&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>&1
cd /app
exec sudo -u app_user rvm 1.9.1-p378 exec ruby main.rb
Этот работает нормально, за исключением того, что это процесс RVM, который порождается daemontools, и он не реагирует, когда получает SIGTERM, что не очень хорошо. По сути, это означает, что служба не может быть перезапущена вручную, что не очень хорошо.