delayed_jobの自動再起動
TRANSCRIPT
![Page 1: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/1.jpg)
delayed_job の自動再起動
Shinjuku.rb #29firewood@github
![Page 2: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/2.jpg)
対象サイト https://competitiveprogramming.info/ Rails 4.0 コンテスト情報の更新の際に delayed_j
ob を使用
![Page 3: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/3.jpg)
背景 delayed_job のイメージ ( 偏見 )
redis 等が不要なので手軽 たまにゾンビプロセス化する
![Page 4: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/4.jpg)
要求 落ちること自体は仕方ない ただし、正常に動いてないなら自動的
に再起動してほしい
![Page 5: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/5.jpg)
信頼する・しない monit ( デーモンの監視 )
とりあえず信頼する delayed_job
完了したタスクについては信頼する 常に生きてるとは思わないことにする
![Page 6: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/6.jpg)
monit https://mmonit.com/monit/ 様々な種類のリソースが監視できる
process ID(PID) 、ポート、 CPU 負荷など
![Page 7: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/7.jpg)
何を監視するか決める プロセスは存在しているが仕事をして
いなかったり、ポートは開いているがサービスを提供していなかったりする
実際の仕事を監視したほうがいい 一箇所だけならアプリケーションレベル
で監視する
![Page 8: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/8.jpg)
基本方針 cron で delayed_job にタスクを積む
ファイルの日付を更新するだけの touch というタスク
タスクが実行されなかったら monit 経由で再起動させる
![Page 9: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/9.jpg)
crontab -l0,30 * * * * /bin/bash -lc 'cd /data/compinfo/current && ./bin/rake hoge:touch‘
30 分に一度タスクを積む
![Page 10: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/10.jpg)
/etc/monit.d/delayed_jobcheck file delayed_job with path /data/compinfo/shared/tmp/pids/
alive if timestamp > 60 minutes then restart start program = “/bin/su - user –c 'cd /data/compinfo/current; bin/delayed_job start; bin/rake hoge:touch'“ stop program = "/bin/su - user –c 'cd /data/compinfo/current; bin/delayed_job stop'“
60 分更新がなければ、 delayed_jobを再起動させてタスクを積む
![Page 11: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/11.jpg)
lib/tasks/hoge.rake namespace :hoge do task :touch => :environment do Hoge.delay.touch endend
Hoge.touch をタスクに積む
![Page 12: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/12.jpg)
touchclass Hoge < ActiveRecord::Base def self.touch FileUtils.touch Rails.root.join('tmp/pids/alive') endend
ファイルのタイムスタンプを更新する
![Page 13: delayed_jobの自動再起動](https://reader036.vdocuments.pub/reader036/viewer/2022081900/587f65011a28ab9b398b5b17/html5/thumbnails/13.jpg)
課題 再起動するまでが長い
→ プロセスが落ちている場合にも再起動する
monit の default の監視間隔が 1 分なので、復帰直後に重いタスクがあると再起動してしまう→ すべてのタスクの先頭で Hoge.touch を
呼ぶようにする