【问题标题】:How can I make capistrano wait for a service to start up on all servers before continuing?如何让 capistrano 在继续之前等待所有服务器上的服务启动?
【发布时间】:2011-11-02 22:29:53
【问题描述】:

我们使用 capistrano 进行部署。我们的网站由 Rails 前端和 java API 后端组成。

我有一种情况,Java API 应用程序需要大约 15 分钟才能启动,而没有它,rails 应用程序就无法运行。最初我尝试使用 capture 命令在 capistrano 中循环,以等待应用程序开始监听端口(在我们的例子中为 8080):

desc "Start api"
task :api, :roles => :api do
  run("cd #{home_api} && ./api.sh start > /dev/null 2>&1 &")
  sleep 1
  api_status = nil
  until api_status
    api_status = capture("echo `netstat -tln | grep 8080`")
    sleep 60
  end
  puts "API Started successfully."
end

但是,capture only runs on one server(我们有几台 API 机器)如果其中一台在其他机器之前完成启动,则部署可能会在所有 API 机器准备好之前继续。

我需要一些东西来等待所有与指定角色匹配的服务器上的端口打开,然后再继续。

【问题讨论】:

    标签: deployment capistrano


    【解决方案1】:

    这是我目前的做法:

    使用 'run' 执行一些 shell 命令,这些命令在端口打开之前(或者在这种情况下,直到 30 分钟过去)才会返回。这将在所有匹配的服务器上运行,并且不会继续,直到所有他们已经完成了。

    desc "Start api"
    task :api, :roles => :api do
      run("cd #{home_api} && ./api.sh start > /dev/null 2>&1 &")
      sleep 1
      run("for i in {0..60}; do echo \"Waiting for API to start\"; if [[ \"\" != \"$\(netstat -an |grep 8080\)\" ]]; then break; fi; sleep 30; done")
    end
    

    我很想知道其他人是如何做到这一点的,肯定有更好的方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      相关资源
      最近更新 更多