完了するまでに非常に長い時間がかかるジョブがいくつかあります。通常1~3時間。私は宝石「デーモン」を使用して、遅延ワーカーをデーモン化します。rake タスク「script/delayed_job stop」を使用してそれらを停止すると、ワーカーが終了するまで停止しません...
ジョブを停止するための素晴らしく簡単な解決策はありますか?
私はなんとか1つを行うことができましたが、他の提案も大歓迎です。
アイデアは次のとおりです。
- 「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