2011-11-02 42 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 

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

相關問題