Como reiniciar o Rails a partir do Rails?
Ok, então eu gostaria de criar uma ação no Rails para reiniciar a si mesma. Pesquisei um pouco e encontrei:
http: //snippets.dzone.com/posts/show/500
O que sugere 2 comandos, um para parar e outro para reiniciar. O seguinte mata:
ps -a|grep "/usr/local/bin/ruby script/server"|grep -v "grep /usr"|cut -d " " -f1|xargs -n 1 kill -KILL $1
O sinal -HUP não é reiniciado para mim, então tentei alterar o comando acima (ajustado para que o comando funcionasse bem com o modo como eu estava iniciando o servidor no Ubuntu):
ps -eaf|grep "ruby script/server"|grep -v grep|cut -d " " -f3|xargs -n 1 kill -KILL $1;script/server
Isso funciona bem no meu ambiente, então tentei configurar uma ação para executá-la:
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
A ação mata o servidor corretamente, mas na verdade não inicia o backup do servidor:
=> 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
Não estou entendendo direito por que o endereço já está em uso quando Mongrel parece ter acabado de sai
Encontrei esta pergunta:
Como você reinicia o Rails no Mongrel, sem parar e iniciar o Mongrel
mas os sinais não causam o reinício no meu ambiente, eles acabam acabando com o process
Alguém tem alguma idéia sobre o que pode funcionar? Para algumas anotações em meu ambiente: instalei o Rails a partir de uma nova versão do RubyGems e Mongrel. Eu uso o script / servidor para iniciar o servidor, que obviamente usa o Mongrel. Estou no Ubuntu Hardy Heron.