Как перезапустить Rails изнутри Rails? - PullRequest
6 голосов
/ 07 апреля 2009

Хорошо, поэтому я хотел бы создать действие в Rails для перезапуска. Я немного поискал и нашел:

http://snippets.dzone.com/posts/show/5002

Который предлагает 2 команды: одну для остановки и другую для перезапуска. Следующие убийства:

ps -a|grep "/usr/local/bin/ruby script/server"|grep -v "grep /usr"|cut -d " " -f1|xargs -n 1 kill -KILL $1

Сигнал -HUP для меня не перезапускается, поэтому я попытался изменить вышеприведенную команду (настроено таким образом, чтобы команда работала нормально при запуске сервера под Ubuntu):

ps -eaf|grep "ruby script/server"|grep -v grep|cut -d " " -f3|xargs -n 1 kill -KILL $1;script/server

Это прекрасно работает в моей среде, поэтому я попытался настроить действие для его выполнения:

def restart
  fork { exec "ps -eaf|grep \"ruby script/server\"|grep -v grep|cut -d \" \" -f3|xargs -n 1 kill -KILL $1;script/server" }
  redirect_to "/server_maintenance"
end

Действие прекрасно убивает сервер, но фактически не запускает резервное копирование сервера:

=> Booting Mongrel
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize_without_backlog': Address already in use - bind(2) (Errno::EADDRINUSE)
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize'
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `new'
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `initialize'
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `new'
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `run'
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/commands/server.rb:111
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from script/server:3

Я не совсем понимаю, почему адрес уже используется, когда кажется, что Mongrel только что вышел.

Я нашел этот вопрос:

Как перезапустить Rails под Mongrel, без остановки и запуска Mongrel

но сигналы не вызывают перезапуск в моей среде, они просто заканчивают тем, что убили процесс.

У кого-нибудь есть идеи о том, что может работать? Несколько замечаний по моей среде: я установил Rails из новой версии RubyGems и Mongrel. Я использую скрипт / сервер для запуска сервера, который, конечно, использует Mongrel. Я на Ubuntu Hardy Heron.

Ответы [ 3 ]

4 голосов
/ 07 апреля 2009

Если вы не против переключиться на mod_rails, вы можете перезапустить свой сервер, создав $ RAILS_ROOT / tmp / restart.txt, что приведет к перезапуску только экземпляра Rails, который вам нужен.

Ваша команда PS выглядит (краткий взгляд) так, как будто она уничтожит все процессы rails на вашем компьютере. Это хорошо, если вы являетесь единственным приложением Rails на компьютере, но если несколько пользователей работают под одним и тем же пользователем или вы работаете как пользователь root, вы убьете их всех. Плохая форма!

Это указывает на монгрела. Вот как ты хочешь попробовать.

3 голосов
/ 07 апреля 2009

Хорошо, я нашел исправление ... Я изменил способ запуска рельсов на:

mongrel_rails start -d

и теперь это сделает следующее действие:

def restart
  fork { exec "mongrel_rails restart" }
  redirect_to "/server_maintenance"
end

В качестве предупреждения, redirect_to вызовет неудачную загрузку, потому что сервер не работает ... однако перезагрузка после паузы покажет, что перезагрузка прошла успешно. Это можно исправить, изменив перезапуск на AJAX с последующей перезагрузкой javascript ... но я оставлю это в качестве упражнения для читателя.

0 голосов
/ 07 апреля 2009

В наших консультациях со стартапами, работающими на их сайтах на Rails, мы использовали два метода управления процессами mongrel.

Во-первых, мы написали пользовательский гем под названием mongrel_runit . Это устанавливает шавки как сервисы в runit .

Во-вторых, мы использовали бог для мониторинга процессов беспородных. Это будет работать с mongrel_runit или с «нормальными» конфигурациями mongrel.

...