2012-03-11 12 views
3

神を使用する(godrb.com)アプリケーションを配備するときに既存のプロセスのステータスに関係なく新しいプロセスを起動するレシピを作成しようとしています。既存のプロセスは、現在のタスクを完了するために長い実行タイムアウトが必要ですが、新しいプロセスは新しくデプロイされたコードを使用してすぐに開始する必要があります。神 - 既存のプロセスがまだ停止している間に新しいプロセスを開始する

私は今現在、停止時に300秒のタイムアウトを設定しますが、新しいプロセスを開始する前に300秒間待機します。この場合

God.watch do |w| 
    w.name = "sidekiq" 
    w.interval = 30.seconds 
    w.start = "bash -lc 'cd /path/to/current && ./bin/sidekiq -P /path/to/shared/pids/sidekiq.pid'" 
    w.stop = "bash -lc 'kill -USR1 `cat /path/to/shared/pids/sidekiq.pid`'" 
    w.stop_timeout = 300.seconds 
    w.pid_file = "/path/to/shared/pids/sidekiq.pid" 
    w.behavior(:clean_pid_file) 
end 

kill -USR1は、任意の現在のジョブの処理を完了するために、しかし、仕事はもう取らないためにsidekiqに指示します。

私は既存のワーカーに300秒のタイムアウトを維持したいが、killコマンドが実行されるとすぐに新しいプロセスを開始したい。

+0

あなたはユニコーンがこれを行う方法を見たことがありますか?新しい労働者を育て、新しい労働者が古い労働者を殺すようにするのはUnicornの責任です。 – d11wtq

+0

はい、その機能はUnicornの一部です。私は一般的なプロセスと同様のことを達成しようとしています。 – bensie

答えて

0

いくつかのトランジションを定義する必要があると思います。

これは私のgod.rb次のとおりです。

# I'm using Rails 
rails_env = ENV['RAILS_ENV'] || 'development' 
rails_root = '/path/to/current' 
pid_file = "#{rails_root}/tmp/pids/sidekiq.pid" 

God.watch do |w| 
    w.dir = rails_root 
    w.name = "sidekiq" 
    w.interval = 30.seconds 
    w.env = {'RAILS_ENV' => rails_env, 'BUNDLE_GEMFILE' => "#{rails_root}/Gemfile"} 
    w.uid = 'deployer' 
    w.gid = 'staff' 

    w.start = "cd #{rails_root}; bundle exec sidekiq -e #{rails_env} -C#{rails_root}/config/sidekiq.yml -i #{i} -P #{pid_file}&" 
    w.stop = "cd #{rails_root}; bundle exec sidekiqctl stop #{pid_file} 10" 
    w.restart = "#{w.stop} && #{w.start}" 
    w.start_grace = 15.seconds 
    w.restart_grace = 15.seconds 
    w.pid_file = pid_file 
    w.log = "#{rails_root}/log/sidekiq.log" 

    # clean pid files before start if necessary 
    w.behavior(:clean_pid_file) 

    # 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 
    end 

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

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

    # lifecycle 
    w.lifecycle do |on| 
    on.condition(:flapping) do |c| 
     c.to_state = [:start, :restart] 
     c.times = 5 
     c.within = 5.minute 
     c.transition = :unmonitored 
     c.retry_in = 10.minutes 
     c.retry_times = 5 
     c.retry_within = 2.hours 
    end 
    end 
end 
関連する問題