2011-09-21 3 views
5

프로덕션 웹 사이트에서 Resque를 사용하고 있습니다.God resque worker rake

배포 할 때마다 GOD가 모든 작업자를 중지 한 다음 다시 시작하여 클래스의 코드를 변경하고 실패한 작업을 다시 대기시키기를 원합니다.

문제는 내가 신을 멈추게 할 때 레이크가 실제로 멈추지 않는다는 것인데, 노동자들은 여전히 ​​살아 있고 이전 코드로 작업하여 모든 문제를 만듭니다.

'신 종료'라고해도 노동자를 죽이지는 않습니다.

지금은 쉘 스크립트를 사용하여 작업자를 죽이고 있지만 이후 서버가 하나 이상이므로 모든 프로덕션 서버에서 작업하는 것이 매우 어렵습니다.

rails_env = ENV['RAILS_ENV'] || "production" 
rails_root = ENV['RAILS_ROOT'] || "/mnt/data-store/html/gogobot/current" 
num_workers = rails_env == 'production' ? 5 : 2 

num_workers.times do |num| 
    God.watch do |w| 
    w.dir  = "#{rails_root}" 
    w.name  = "resque-#{num}" 
    w.group = "resque" 
    w.interval = 2.minutes 
    w.env  = {"QUEUE"=>"duplicate_merging,facebook_wall_posts,generic,mailer,notifications,realtime,scoring_system,signup,social_graph_facebook,social_graph_foursquare,social_graph_twitter,user_info,user_score", "RAILS_ENV"=>rails_env, "PIDFILE" => "#{rails_root}/tmp/resque_#{w}.pid"} 
    w.pid_file = "#{rails_root}/tmp/resque_#{w}.pid" 
    w.start = "cd #{rails_root}/ && rake environment resque:work QUEUE=duplicate_merging,facebook_wall_posts,generic,mailer,notifications,realtime,scoring_system,signup,social_graph_facebook,social_graph_foursquare,social_graph_twitter,user_info,user_score RAILS_ENV=#{rails_env}" 
    w.log  = "#{rails_root}/log/resque_god.log" 

    w.uid = 'root' 
    w.gid = 'root' 

    # restart if memory gets too high 
    w.transition(:up, :restart) do |on| 
     on.condition(:memory_usage) do |c| 
     c.above = 350.megabytes 
     c.times = 2 
     end 
    end 

    # determine the state on startup 
    w.transition(:init, { true => :up, false => :start }) do |on| 
     on.condition(:process_running) do |c| 
     c.running = true 
     end 
    end 

    # determine when process has finished starting 
    w.transition([:start, :restart], :up) do |on| 
     on.condition(:process_running) do |c| 
     c.running = true 
     c.interval = 5.seconds 
     end 

     # failsafe 
     on.condition(:tries) do |c| 
     c.times = 5 
     c.transition = :start 
     c.interval = 5.seconds 
     end 
    end 

    # start if process is not running 
    w.transition(:up, :start) do |on| 
     on.condition(:process_running) do |c| 
     c.running = false 
     end 
    end 
    end 
end 

1.times do |num| 
    God.watch do |w| 
    w.name  = "dj-#{num}" 
    w.group = 'dj' 
    w.interval = 30.seconds 
    w.start = "cd #{rails_root} && rake jobs:work" 

    w.uid = 'root' 
    w.gid = 'root' 

    # retart if memory gets too high 
    w.transition(:up, :restart) do |on| 
     on.condition(:memory_usage) do |c| 
     c.above = 300.megabytes 
     c.times = 2 
     end 
    end 

    # determine the state on startup 
    w.transition(:init, { true => :up, false => :start }) do |on| 
     on.condition(:process_running) do |c| 
     c.running = true 
     end 
    end 

    # determine when process has finished starting 
    w.transition([:start, :restart], :up) do |on| 
     on.condition(:process_running) do |c| 
     c.running = true 
     c.interval = 5.seconds 
     end 

     # failsafe 
     on.condition(:tries) do |c| 
     c.times = 5 
     c.transition = :start 
     c.interval = 5.seconds 
     end 
    end 

    # start if process is not running 
    w.transition(:up, :start) do |on| 
     on.condition(:process_running) do |c| 
     c.running = false 
     end 
    end 
    end 
end 

내가 하나님을 이용하여 레이크 작업을 중지 할 수있는 방법에 어떤 도움을 주셔서 감사합니다 :

이 내 신 설정 파일입니다.

감사합니다.

답변

7

이 솔루션은 그래서 예를 들어 당신이 실행할 수있는 프로세스를 에 SIGQUIT를 보내는 것입니다

god signal resque SIGQUIT 
관련 문제