rails (ruby) で forever 的なことがやりたい際のベストプラクティス
バックグラウンドのバッチ処理を rails (のサブセット: ActiveRecord などのみ使う) で記述しています。結果、 Application#load_tasks
により bundle exec rake
コマンドでバッチをコマンドで実行できる状態になっていたとします。
この時に、バッチのメインループを、失敗しようが成功しようが、ある一定のインターバルを挟んだ上で、ひたすらループしたいと考えています。これは、どう実現するのがベストでしょうか?
似たようなことを実現する上で、有名なツールとして whenever
がありますが、これは cron による定期実行をサポートするツールであって、「秒単位でインターバルを指定しながらひたすらループしたい」という今回やりたいことは満たせないと思っています。
また、同じ系統のツールたちに、 もろもろの job queue (active_job でサポートされるような) がありますが、 redis を前提としているものが大半であったりして、わりと、オーバーキルな気がしています。
運用でどうにかするという観点では、現在では以下のように tmux session と shell script を組み合わせています。
tmux new-session -s セッション名 -d 'while true; do 実行したいコマンド; sleep インターバル; done'
ただ、この方法は、なんというかあまり rail にのっかっていないというか、ちょっと気をつかわないと上手く動かなかったりするので、これをよろしくやってくれるライブラリなどがあれば知りたいな、と思っています。