我有一些工作需要很长时间才能完成。一般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