ウェブサービスを作っています。

メモリリークを起こすジョブを DelayedJob で実行する

1 ジョブごとに worker を終了させて god で再度起動させる、あまり良くない方法です。


ジョブ。グローバル変数 $exit を true にすると、job から worker を終了させられます。

class HogeJob
  def perform
    .. (leaking process) ..

    $exit = true
  end
end


delayed_job 監視 god 設定ファイル。5 秒ごとに監視。
RAILS_ROOT/config/delayed_job.god などに保存。

RAILS_ROOT = File.expand_path('..', File.dirname(__FILE__))
RAILS_ENV = 'production'

God.watch do |w|
  w.name = 'delayed_job'
  w.pid_file = "#{ RAILS_ROOT }/tmp/pids/delayed_job.pid"
  w.start = "cd #{ RAILS_ROOT }; RAILS_ENV=#{ RAILS_ENV } script/delayed_job start"
  w.restart = "cd #{ RAILS_ROOT }; RAILS_ENV=#{ RAILS_ENV } script/delayed_job restart"
  w.stop = "cd #{ RAILS_ROOT }; RAILS_ENV=#{ RAILS_ENV } script/delayed_job stop"

  w.start_if do |start|
    start.condition(:process_running) do |c|
      c.interval = 5.seconds
      c.running = false
    end
  end
end