7

好的,所以我想在 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 似乎刚刚退出时该地址已经在使用中。

我发现了这个问题:

如何在 Mongrel 下重启 Rails,而不停止和启动 Mongrel

但信号不会导致我的环境重新启动,它们最终会终止进程。

有人对什么可能有用有任何想法吗?关于我的环境的一些说明:我从新版本的 RubyGems 和 Mongrel 安装了 Rails。我使用脚本/服务器来启动服务器,当然使用 Mongrel。我在 Ubuntu Hardy Heron 上。

4

3 回答 3

4

如果您不介意切换到 mod_rails,您可以通过创建 $RAILS_ROOT/tmp/restart.txt 重新启动服务器,这只会导致您关心的 Rails 实例重新启动。

您的 PS 命令看起来(粗略一瞥)就像它会杀死您盒子上的所有 rails 进程。如果您是机器上唯一的 Rails 应用程序,那很好,但如果有几个以同一用户身份运行,或者您以 root 身份运行,您将把它们全部杀死。形式不好!

为杂种动物指出了这一点。有你想尝试的方式。

于 2009-04-07T07:05:35.213 回答
3

好的,我找到了解决方法...我将启动 rails 的方式更改为:

mongrel_rails start -d

现在将执行以下操作:

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

作为警告,redirect_to 将导致加载失败,因为服务器将关闭......但是暂停后重新加载将显示重新启动成功。这可以通过将重新启动更改为使用 AJAX 完成,然后重新加载 javascript 来解决......但我将把它作为练习留给读者。

于 2009-04-07T07:07:16.647 回答
0

在咨询在 Rails 上运行其网站的初创公司时,我们使用了两种方法来管理混合进程。

首先,是我们编写的自定义 gem,名为mongrel_runit。这将 mongrel 设置为 runit 中的服务

其次,我们使用god来监控mongrel进程。这适用于 mongrel_runit 或“正常”的 mongrel 配置。

于 2009-04-07T13:54:24.747 回答