使用上帝终止非守护进程的正确方法是什么?

时间:2011-07-04 05:48:55

标签: ruby ruby-on-rails-3 daemon eventmachine god

我有一个班级,我用神监视。这是它的结构:

LIB / 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 :(得分:0)

有点无关,但你不应该在循环中使用EM :: run()...... EM只启动一次,然后它只会对它听到的任何输入作出反应......

在同一主题上,使用

保护您的EM流程通常是个好主意
Signal.trap("INT") do 
  EM::stop()
end

这将确保您在关闭之前干净地完成所有操作。