2013-04-26 9 views
0

저는 Mongrel 클러스터와 함께 실행되는 Rails 애플리케이션의 배치를 관리하기 위해 Chef를 사용하고 있습니다.Chef를 사용하여 init.d 스크립트를 통해 Mongrel 클러스터를 다시 시작합니다.

init.d 파일은 매우 간단합니다. 여기에 다시 시작의 경우는 다음과 같습니다

restart) 
    sudo su -l myuser -c "cd /path/to/myapp/current && mongrel_rails cluster::restart" 
    ;; 

나는 어떤 문제에 rootservice myapp restart를 실행할 수 있습니다. mongrel_rails cluster::restartmyuser으로 실행할 수 있습니다.

그러나 Chef를 통해 배포를 수행하면 tmp/pids/mongrel.port.pid 파일이 정리되지 않아 향후 재시작이 실패하게됩니다.

요리사는 단순히 재시작을 수행하기 위해 다음을 수행한다 :

init.d 스크립트는 확실히 물론, PID 파일에 폭발을 제외하고 예상되는 출력 (이 모든 로그로 호출되는
service "myapp" do 
    action :restart 
end 

).

무엇이 누락 되었습니까?

+0

그래서 정상 작동에'init.d' 스크립트가 PID 파일을 정리하지만 요리사를 통해 호출하지 않을 경우? – cmur2

+0

@ cmur2 수정하십시오. –

답변

1

해결 방법으로, 나는 init.d 스크립트가 호출되기 전에 mongrel 프로세스를 죽일 수 있습니다. 이것은 init.d 스크립트가 서버에서 직접 프로세스를 시작/중지하는 데 여전히 사용될 수 있지만 mongrel이 실행 중이고 Chef가 서비스를 다시 시작하려고 할 때 가짜 케이스를 처리합니다. 요리사는 .pid 파일이 아직 존재하지 않는 한 서비스를 올바르게 시작합니다.

는이를 위해, 나는 포함하여 service "myapp" do 호출 전에 바로 다음

ruby_block "stop mongrel" do 
    block do 
    ports = ["10031", "10032", "10033"].each do |port| 
     path = "/path/to/myapp/shared/pids/mongrel.#{port}.pid" 
     if File.exists?(path) 
     file = File.open(path, "r") 
     pid = file.read 
     file.close 
     system("kill #{pid}") 
     File.delete(path) if File.exists?(path) 
     end 
    end 
    end 
end