好的,所以我想在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似乎刚刚退出时,地址已经被使用了。
我发现了这个问题:
How do you restart Rails under Mongrel, without stopping and starting Mongrel
但信号不会导致我的环境重启,他们最终会终止这个过程。
任何人对可行的方法都有任何想法?关于我的环境的一些注意事项:我从新版本的RubyGems和Mongrel安装了Rails。我使用脚本/服务器启动服务器,当然使用Mongrel。我在Ubuntu Hardy Heron上。
答案 0 :(得分:4)
如果您不介意切换到mod_rails,可以通过创建$ RAILS_ROOT / tmp / restart.txt来重新启动服务器,这只会导致您关心的Rails实例重新启动。
你的PS命令看起来(诅咒一瞥)就像它会杀死你盒子上的所有导轨进程。如果你是一台机器上唯一的Rails应用程序,那很好,但如果有少数运行同一个用户或你以root身份运行,那么你将全部杀死它们。形式不好!
This指出了杂种。有你想尝试的方式。
答案 1 :(得分:3)
好的,我发现了一个修复...我改变了我开始使用rails的方式:
mongrel_rails start -d
现在可以执行以下操作:
def restart
fork { exec "mongrel_rails restart" }
redirect_to "/server_maintenance"
end
作为警告,redirect_to将导致加载失败,因为服务器将关闭...但是暂停后重新加载将显示重新启动成功。这可以通过改变使用AJAX完成重启,然后重新加载javascript来修复......但我会将其作为练习留给读者。
答案 2 :(得分:0)
在我们咨询在Rails上运行其站点的初创公司时,我们使用了两种方法来管理mongrel进程。
首先,我们写的是一个名为mongrel_runit的自定义宝石。这会将mongrels设置为runit中的服务。
其次,我们使用god来监控mongrel进程。这将适用于mongrel_runit或“普通”杂种配置。