2011-11-02 46 views
3

我们用capistrano进行部署。我们的网站由一个rails前端和java API后端组成。如何让Capistrano在继续之前等待所有服务器上的服务启动?

我有一种情况,java API应用程序需要大约15分钟才能启动,并且rails应用程序无法在没有它的情况下运行。起初,我使用捕获命令等待试图循环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机器准备就绪之前,可以在其他部署之前启动。

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

回答

4

这里是如何我目前做的:

用“跑”来执行一些不会返回,直到该端口是开放的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 

我很好奇,看看其他人如何做这件事,那里肯定有更好的方法?

相关问题