環境
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
のレシピを追記した。
まとめ
結構、長くなってしまったけど一応動いているっぽい。
というのも、本格運用してないのでまだわからない(笑)