Capistrano没有正确重启Mongrel集群

Pet*_*ete 5 ruby deployment mongrel capistrano ruby-on-rails

我有一个在nginx下运行的三个mongrel集群,我使用Capistrano 2.4.3部署应用程序.当我有一个正在运行的系统时"封盖部署",行为是:

  1. 该应用程序已部署.代码已成功更新.
  2. 在cap deploy输出中,有这样的:

    • 执行"sudo -p"sudo密码:'mongrel_rails cluster :: restart -C /var/www/rails/myapp/current/config/mongrel_cluster.yml"
    • 服务器:["myip"]
    • [myip]执行命令
    • **[out :: myip]停止端口9096
    • **[out :: myip]停止端口9097
    • **[out :: myip]停止端口9098
    • **[out :: myip]已经启动了端口9096
    • **[out :: myip]已经启动了端口9097
    • **[out :: myip]已经启动了端口9098
  3. 我立即检查服务器并发现Mongrel仍在运行,并且前三个实例的PID文件仍然存在.
  4. 不久之后(不到一分钟),我发现Mongrel不再运行,PID文件消失,无法重启.
  5. 如果我手动启动服务器上的mongrel,应用程序启动就好了.

在尝试重新启动集群之前,似乎'mongrel_rails cluster :: restart'没有正确等待完全停止.如何诊断和解决此问题?

编辑:这是答案:

mongrel_cluster,在"重启"任务中,只需执行以下操作:

 def run
   stop
   start
 end
Run Code Online (Sandbox Code Playgroud)

在调用"start"之前,它不会等待或检查进程是否已退出.这是一个已知错误,提交了一个未完成的补丁.我将补丁应用于Mongrel Cluster,问题就消失了.

rwc*_*c9u 4

您可以通过在 capistrano 配方中添加以下内容来显式告诉 mongrel_cluster 配方在启动前删除 pid 文件:

# helps keep mongrel pid files clean
set :mongrel_clean, true
Run Code Online (Sandbox Code Playgroud)

这会导致它将 --clean 选项传递给 mongrel_cluster_ctl。

我回去查看了我的部署方案之一,发现我还更改了重新启动任务的工作方式。看看 mongrel 用户组中的以下消息:

杂种用户讨论重启

以下是我的部署:重新启动任务。我承认这有点黑客行为。

namespace :deploy do
  desc "Restart the Mongrel processes on the app server."
  task :restart, :roles => :app do
    mongrel.cluster.stop
    sleep 2.5
    mongrel.cluster.start
  end
end
Run Code Online (Sandbox Code Playgroud)