🤖

upstart + god + rails + daemons-railsでworkerを生かし続ける

2021/12/29に公開

環境

EC2(AmazonLinux)上で構築

software version
upstart 0.6.5
god 0.13.1
daemons-rails 1.1.1

インストール

upstart

AmazonLinuxの場合は、upstartはすでに入っていたので特に何もなし

god/daemons-rails

RailsプロジェクトのGemfileに追加

Gemfile
gem 'daemons-rails'
gem 'god'

その後にbundle install

$ bundle install --path vendor/bundle

設定

daemons-rails

workerという名前のdaemonを作る

$ bundle exec rails g daemon worker

$ cat config/daemons.yml
dir_mode: script
dir: ../../log
multiple: false
backtrace: true
monitor: false
ontop: false
  • workerの実処理はlib/daemons/worker.rb
  • pidファイルはlog/worker.rb.pid

動作確認をしてみる

$ RAILS_ENV=development bundle exec rake daemon:worker:start

コマンド自体はすぐに終了するがログを見ると動いているのがわかる

god

次にgodの設定

以下のファイルを作成

#{Rails.root}/config/app.god
root_dir = File.expand_path(File.dirname(__FILE__) + '/../')
ENV["RAILS_ENV"] ||= "development"
rails_env = ENV["RAILS_ENV"]

God.watch do |w|
  w.name = "worker"
  w.interval = 5.seconds
  w.start = "cd #{root_dir} && RAILS_ENV=#{rails_env} bundle exec rake daemon:worker:start"
  w.pid_file = "#{root_dir}/log/worker.rb.pid"
  w.keepalive
  w.behavior(:clean_pid_file)
end

動作確認は

$ bundle exec god -c config/app.god -D

とするとフォアグラウンドで起動してログがつらつらと出力される

$ kill `cat log/worker.rb.pid`

をやってみるとすぐにまたworkerが起動するのがわかる

$ bundle exec god stop worker

とするとworkerを落とせる

god自体の落とし方がよくわからなかったけど別のターミナルで

$ bundle exec god terminate

としたらちゃんとworkerも落とした上で落ちてくれた。

godkillしたらworkerが生き続けていた…。

upstart

最後にupstart

upstartworkerを管理してもいいんだけどRailsプロジェクト内にdaemonを集約したいのでupstartgodを管理

/etc/init/god.conf
description "god"

start on runlevel [2345]
stop on runlevel [!2345]

chdir /data/app/current # Rails.root
env RAILS_ENV=development # Rails.env

script
  /usr/local/bin/bundle exec god -c config/app.god -l /var/log/god.log -D
end script

pre-stop script
  /usr/local/bin/bundle exec god terminate
end script

respawn
respawn limit 5 10

bundleのパスなどは環境に応じて適宜変更。

  • godはSIGTERMを受け取っても監視対象プロセスをkillしてくれないのでpre-stopで監視対象を終了させる
# start god

godが起動する事を確認。

# stop god

godが落ちる事を確認。

# kill xxxx

godkillしても立ち上がる事を確認。

deploy時

一応、godrestartしてる。
Capistranoの場合は、after 'deploy:restart'のところにrestartのレシピを追記した。

まとめ

結構、長くなってしまったけど一応動いているっぽい。

というのも、本格運用してないのでまだわからない(笑)

Discussion