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