停止长时间运行延迟的工作

时间:2012-06-27 20:37:29

标签: ruby delayed-job

我有一些工作需要很长时间才能完成。通常1-3个小时。 我使用gem“守护进程”来守护延迟的工人。 如果我使用rake任务:“script / delayed_job stop”来阻止它们,那么它们将不会停止直到 工人完成......

是否有一个很好的简单解决方案来阻止这些工作?

我设法做了一个,但也欢迎任何其他建议。

这个想法是:

  • 捕获“TERM”信号(因为守护进程为其生成的进程发送“TERM”)并保存旧的
  • 当“TERM”信号到来时,然后完成工作(但尚未退出)
  • 终止作业设置后,
  • 返回“TERM”的旧处理程序
  • 将“TERM”发送到我所在的流程(旧的处理程序将被调用)

以下是代码:

def self.prepare_to_be_stopped_by_daemons
  self.old_trap = Signal.trap("TERM") do
    self.should_terminate = true
  end
end
def check_the_stop_signal_by_daemons
  if self.class.should_terminate
    Delayed::Worker.logger.debug "Asked to be TERMINATED. Calling the old trap." if Delayed::Worker.logger
    self.class.restore_old_trap
    Process.kill("TERM", Process.pid)

    raise StopCrawlingException.new
  end
end

def self.restore_old_trap
  Signal.trap("TERM", old_trap)
end

0 个答案:

没有答案