やりたいこと
Railsでcronを管理するためのgem whenever
を使って秒数まで指定してバッチを実行する。
cronは分数までしか指定できない。
てっきりschedule.rb
にてevery :day, at: jst_to_utc('8:00 pm') do
と指定すれば
YYYY-MM-DD 20:00:00
に実行されるものだと思っていましたが、どうやら多少の誤差があるようです。
実行結果を見ると、7~13秒ほど遅れて実行されていました。
00秒きっちりにバッチ処理を実行するにはcronの指定だけではできないようです。
batch内でどうにかする
例 )
毎時 10分00秒にバッチを実行したい場合
バッチが00:09:13
あたりに実行されてそこから00:10:00
までループ処理を実行します。
すると実行したい処理が00秒きっちりに実行されるようになりました。
config/schedule.rb
every '9,19,29,39,49,59 * * * *' do
runner 'Hoge::Fuga.execute'
end
app/batches/hoge/fuga.rb
module Hoge
class Fuga < ApplicationBatch
def process
loop do
break if Time.current.sec.zero?
end
p Time.current
## 実行したい処理
end
end
end
$ rails runner 'Hoge::Fuga.execute'
> Fri, 18 Jan 2019 12:48:00 JST +09:00
00秒ぴったりに実行されました。
無事秒数まで指定してbatchを実行することができましたが、処理が走ってから00秒になるまでずっとループしているので少し怖いです。
もしイケてる方法を知っている方がいたらご教授お願いします。