1

我有一些工作需要很长时间才能完成。一般1-3小时。我使用宝石“守护进程”来守护延迟的工人。如果我使用 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
4

0 回答 0