環境
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に追加
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の設定
以下のファイルを作成
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も落とした上で落ちてくれた。
※godをkillしたらworkerが生き続けていた…。
upstart
最後にupstart
upstartでworkerを管理してもいいんだけどRailsプロジェクト内にdaemonを集約したいのでupstartでgodを管理
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
でgodをkillしても立ち上がる事を確認。
deploy時
一応、godをrestartしてる。
Capistranoの場合は、after 'deploy:restart'のところにrestartのレシピを追記した。
まとめ
結構、長くなってしまったけど一応動いているっぽい。
というのも、本格運用してないのでまだわからない(笑)