Бог - начало нового процесса, пока существующий процесс все еще останавливается - PullRequest
3 голосов
/ 12 марта 2012

Использование Бога (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.

1 Ответ

0 голосов
/ 03 февраля 2015

Я думаю, вы должны определить некоторые переходы.

Это мой 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
...