Запуск приложений Rails с тонким сервисом

Я пытаюсь запустить тонкий сервис на своем веб-сервере. После запуска «sudo thin install» тонкий создал следующий файл в /etc/init.d/thin

#!/bin/sh
DAEMON=/usr/local/lib/ruby/gems/1.9.1/bin/thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
        $DAEMON start --all $CONFIG_PATH
        ;;
  stop)
        $DAEMON stop --all $CONFIG_PATH
        ;;
  restart)
        $DAEMON restart --all $CONFIG_PATH
        ;;
  *)
        echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
        exit 3
        ;;
esac

When the thin service is started, the following is ran

thin start --all /etc/thin
This will scan all of yaml config files defining how to run thin for each app defined. This does not work.

Я вижу в своих журналах:

/usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.0/lib/bundler/runtime.rb:27:in `block in setup': You have already activated eventmachine 0.12.6, but your Gemfile requires eventmachine 0.12.11. Consider using bundle exec. (Gem::LoadError)
  from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.0/lib/bundler/spec_set.rb:12:in `block in each'
  from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.0/lib/bundler/spec_set.rb:12:in `each'
  from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.0/lib/bundler/spec_set.rb:12:in `each'
  from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.0/lib/bundler/runtime.rb:17:in `setup'
  from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.0.0/lib/bundler.rb:100:in `setup'
  from /srv/app/current/config/boot.rb:8:in `<top (required)>'
  from <internal:lib/rubygems/custom_require>:29:in `require'
  from <internal:lib/rubygems/custom_require>:29:in `require'
  from /srv/app/current/config/application.rb:1:in `<top (required)>'
  from <internal:lib/rubygems/custom_require>:29:in `require'
  from <internal:lib/rubygems/custom_require>:29:in `require'
  from /srv/app/current/config/environment.rb:2:in `<top (required)>'
  from <internal:lib/rubygems/custom_require>:29:in `require'
  from <internal:lib/rubygems/custom_require>:29:in `require'
  from /srv/app/current/config.ru:3:in `block in <main>'
  from /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.2.1/lib/rack/builder.rb:46:in `instance_eval'
  from /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.2.1/lib/rack/builder.rb:46:in `initialize'
  from /srv/app/current/config.ru:1:in `new'
  from /srv/app/current/config.ru:1:in `<main>'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/rack/adapter/loader.rb:36:in `eval'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/rack/adapter/loader.rb:36:in `load'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/rack/adapter/loader.rb:45:in `for'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/controllers/controller.rb:163:in `load_adapter'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/controllers/controller.rb:67:in `start'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/runner.rb:177:in `run_command'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/lib/thin/runner.rb:143:in `run!'
  from /usr/local/lib/ruby/gems/1.9.1/gems/thin-1.2.7/bin/thin:6:in `<top (required)>'
  from /usr/local/lib/ruby/gems/1.9.1/bin/thin:19:in `load'
  from /usr/local/lib/ruby/gems/1.9.1/bin/thin:19:in `<main>'

Когда capistrano развертывается, я кэширую свой пакет в каталоге $APP_PATH/shared/bundle; Итак, это объясняет, почему тонкий жалуется на то, что драгоценные камни не установлены, поскольку тонкий сервис не просматривает $APP_PATH/shared/bundle

Это работает:

cd $APP_PATH/current; bundle exec thin start -d -C /etc/thin/app_x.yml

но это не так, как работает файл тонкой службы в /etc/init.d/thin. Думаю, я мог бы написать свой собственный. Я просто не хочу решать проблему, которая уже решена.


person Sean McCleary    schedule 23.11.2010    source источник
comment
обратите внимание, что ошибка не связана с неустановленным драгоценным камнем. Проблема заключается в том, что activemachine активируется два раза для разных версий, и предлагаемое исправление состоит в том, чтобы запустить пакет exec, как вы это делаете.   -  person VP.    schedule 24.11.2010
comment
ВП, да. Казалось бы, тонкий старт --all не знает о существующем кэше пакетов каждого приложения.   -  person Sean McCleary    schedule 24.11.2010
comment
У меня есть кое-что, что работает, чем я не горжусь. gist.github.com/712690   -  person Sean McCleary    schedule 24.11.2010


Ответы (1)


Я придумал это, но я не чувствую, что это лучшее решение, так как оно не использует преимущество тонкой опции «--all», когда он считывает файлы конфигурации из каталога. Вместо этого я изменил файл, который запускает/останавливает/перезапускает тонкую службу, поэтому для каждого приложения я даю ему определенную команду для запуска/остановки/перезапуска. Я уверен, что эту команду можно улучшить, но пока она работает для моих нужд.

#!/bin/sh

# This is a pretty bad, but effective workaround for starting thin as a service per application.

DAEMON=/usr/local/lib/ruby/gems/1.9.1/bin/thin
# DAEMON=/usr/local/bin/bundler thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
  cd /srv/hub/current && bundle exec thin start -d -C /etc/thin/hub.yml
  ;;
  stop)
  cd /srv/hub/current && bundle exec thin stop -d -C /etc/thin/hub.yml
  ;;
  restart)
  cd /srv/hub/current && bundle exec thin restart -d -C /etc/thin/hub.yml
  ;;
  *)
  echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
  exit 3
  ;;
esac
person Sean McCleary    schedule 24.11.2010