LoginSignup
39
36

More than 5 years have passed since last update.

Unicornの再起動時の問題をbefore_forkで対応する

Last updated at Posted at 2013-02-20

Unicornは軽量、かつダウンタイム無しで再起動可能ということでよく利用しています。
ただ、再起動のためにUSR2シグナルを送るとゾンビプロセスが発生します。
とりあえず色々調べて対処した記録。

方法

unicornのconfigに以下を追記します。

config/unicorn.rb

before_fork do |server, worker| 
  # workerの数が1以上ならTTOUを送ってworkerを減らす
  # workerの数が1なら古いmasterをkillする
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      puts "Sending #{sig} signal to old unicorn master..."
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end

  # 順次workerをkillするために、forkされる速度を落とす
  sleep 1
end

after_fork do |server, worker|
  ActiveRecord::Base.establish_connection if defined?(ActiveRecord::Base)
end

この設定をしておけば、あとは再起動時に古いプロセスをkillしてくれます。

kill -USR2 `cat /tmp/unicorn.pid`

参考

http://codelevy.com/2010/02/09/getting-started-with-unicorn.html
https://gist.github.com/jamiew/626672

39
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
36