unicorn+nginxで動かしてるRails をtouchでリスタートしちゃう


経緯

  • エンジニアだけの開発チームにデザイナーが加わった
  • 開発機はなるべく本番と同じにするためWEBrick ではなくnginx+unicornで動いている
  • デザイナーはkill -USR2 とかは打てない

方針

  • 基本はこの記事に書いてあることをやる
  • しかし、デザイナーにtmp/unicorn_restart/restart.txt です!と言っても忘れるかもしれない
  • tmp/restart.txt でrestart出来るよう必要がある

結果

  • config/unicorn.rb にこんな事を追記した
  • 基本的にはListen.toの辺りを変えただけ
before_fork do |_server, _worker|

  # oldsig QUIT
  if File.exists?(old_pid) && _server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end

  # watch restart.txt
  if _worker.nr == 0 && Rails.env.development?
    listener = Listen.to(Rails.root.join('tmp').to_s, only: /\Arestart.txt\z/) do |modified, added, removed|
      pid = _server.config[:pid]
      if pid == _server.pid
        begin
          Process.kill("USR2", File.read(pid).to_i)
        rescue Errno::ENOENT, Errno::ESRCH
        end
      end
    end
    listener.start
  end