Ruby on rails Capistrano未正确重新启动混合群集

Ruby on rails Capistrano未正确重新启动混合群集,ruby-on-rails,ruby,deployment,capistrano,mongrel,Ruby On Rails,Ruby,Deployment,Capistrano,Mongrel,我有一个由三个混血儿组成的集群在nginx下运行,我使用capistrano2.4.3部署了这个应用程序。当我在有运行系统的情况下“cap deploy”时,行为是: 应用程序已部署。代码已成功更新 在cap部署输出中,有以下内容: 正在执行“sudo-p”sudo password:' mongrel_rails群集::重新启动-C /var/www/rails/myapp/current/config/mongrel_cluster.yml” 服务器:[“myip”] [myip]正在执行

我有一个由三个混血儿组成的集群在nginx下运行,我使用capistrano2.4.3部署了这个应用程序。当我在有运行系统的情况下“cap deploy”时,行为是:

  • 应用程序已部署。代码已成功更新
  • 在cap部署输出中,有以下内容:

    • 正在执行“sudo-p”sudo password:' mongrel_rails群集::重新启动-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
  • 我立即检查服务器,发现Mongrel仍然在运行,并且前面三个实例的PID文件仍然存在
  • 不久之后(不到一分钟),我发现Mongrel不再运行,PID文件消失,并且无法重新启动
  • 如果我手动启动服务器上的mongrel,应用程序就会正常启动 “mongrel_rails cluster::restart”似乎没有正确地等待一个句号 在尝试重新启动群集之前。如何诊断和解决此问题

    编辑:答案如下:

    mongrel_集群在“重启”任务中只执行以下操作:

     def run
       stop
       start
     end
    

    在调用“start”之前,它不会等待或检查进程是否退出。这是。我将补丁应用到Mongrel集群,问题消失了

    我不喜欢这么简单,但在它尝试启动时,听起来pid文件仍然挂在那里。确保用手挡住杂种狗。手动清理pid文件。然后执行cap部署。

    首先,通过只调用
    cap部署:重新启动
    来缩小测试范围。您可能希望传递
    --debug
    选项以在远程执行之前进行提示,或者传递
    --dry run
    选项以查看调整设置时发生的情况

    乍一看,这听起来像是pid文件或混合进程上的权限问题,但很难确定。我注意到的几件事是:

    • :runner
      变量显式设置为
      nil
      ——是否有具体原因
    • Capistrano2.4为
      引入了一个新的行为:admin\u runner
      变量。没有看到整个配方,这可能与你的问题有关吗? :跑步者vs:admin\u跑步者(来自) 一些CAPPER已经注意到:runner用户运行deploy:setup和deploy:cleanup会弄乱他们精心设计的权限。我同意这是个问题。在这个版本中,deploy:start、deploy:stop和deploy:restart在sudo时继续使用:runner用户,但是deploy:setup和deploy:cleanup将使用:admin\u runner用户。默认情况下,:admin\u runner变量是未设置的,这意味着这些任务将以root用户身份运行,但如果希望它们以:runner身份运行,只需执行“set:admin\u runner,runner”


    我对下一步做什么的建议。手动停止杂种狗并清理PID。手动启动杂种狗。接下来,在调试问题时继续运行
    cap deploy:restart
    。必要时重复。

    您可以在capistrano配方中添加以下内容,明确告知mongrel_集群配方在开始之前删除pid文件:

    # helps keep mongrel pid files clean
    set :mongrel_clean, true
    
    这导致它将--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
    

    不管怎样,我的杂种狗都是在上一个停止命令关闭它们之前开始的

    睡眠2.5不是一个好的解决方案,如果它需要超过2.5秒来停止所有运行的杂种狗

    似乎需要:

    stop && start
    
    vs

    (bash就是这样工作的,&&等待第一个命令完成w/o错误,而“;”只是运行下一个命令)

    我想知道是否有:

    wait cluster_stop
    then cluster_start
    

    讨论得好:

    谢谢Ryan。我想是你把我弄松了。当我把问题解决后,我会跟进的。这是正确的。请参阅我对问题的编辑:mongrel_cluster有一个补丁修复了该行为。请看以下内容:
    wait cluster_stop
    then cluster_start