Как правильно завершать недемонизированные процессы Богом? - PullRequest
1 голос
/ 04 июля 2011

У меня есть класс, который я отслеживаю, используя Бога. Это его структура:

Библиотека / my_class.rb

#!/usr/bin/env ruby

class MyClass
  def start(config)
    loop do
      EventMachine::run do             
    end
  end
end

begin   
  config = {"foo" => "bar"}  
  my_class = MyClass.new
  my_class.start(config)  
rescue Exception => ex
  puts "Exception in MyClass: #{ex.message} at #{ex.backtrace.join("\n")}"
end

И вот как я бегу с Богом:

конфиг / my_config.god

rails_root = File.dirname(File.dirname(__FILE__))
God.pid_file_directory =  File.join(rails_root, 'tmp/pids/')

# myclass 
God.watch do |w| 
  w.name = "myclass" 
  w.interval = 30.seconds 
  w.start = "#{rails_root}/script/rails runner #{rails_root}/lib/my_class.rb" 
  # w.stop = "do nothing?" 
  # w.restart = "#{w.stop} && #{w.start}"
  w.start_grace = 10.seconds 
  w.restart_grace = 10.seconds 
  w.log = "#{rails_root}/log/my_class.log"

  w.start_if do |start| 
  start.condition(:process_running) do |c| 
    c.interval = 5.seconds 
    c.running = false 
  end 
end 

конец

Так как я не указал остановку (я не знаю как), бог пошлет SIGTERM, а затем SIGKILL, чтобы остановить процесс, если это не удастся. Это как я должен обрабатывать недемонизированные процессы?

1 Ответ

0 голосов
/ 04 июля 2011

Несколько не связано, но вы не должны EM :: run () в цикле ... EM запускается только один раз, а затем он просто реагирует на любые входы, которые он тоже слушает ...

ВклВ той же теме обычно рекомендуется защитить свой процесс EM с помощью

Signal.trap("INT") do 
  EM::stop()
end

, что обеспечит чистое завершение всех операций перед завершением работы.

...