unicornを再起動する

Ruby on Railsでコードを書き換えた場合、アプリケーションサーバーを再起動して反映する必要があるケースに直面します。
unicornを使用している場合、killで以下の3種類のシグナルをunicornのマスターに送ることで新しいサーバープロセスに入れ替えできます。

  1. USR2: 新しいプロセスが起動する
  2. WINCH: 旧プロセスのworkerが順次終了する
  3. QUIT: 旧プロセスのmasterが終了する

以下のようなシェルスクリプトを用意しておくことで、再起動処理を行えます。なお、プロセスIDについては、Railsプロジェクトのconfig/unicorn.rbでpid "/tmp/unicorn.pid"のように設定できます。

#!/bin/bash
pid=`cat /tmp/unicorn.pid`

echo "starting new server..."
kill -s USR2 $pid
sleep 3

echo "stopping old worker..."
kill -s WINCH $pid
sleep 3

echo "stopping old master..."
kill -s QUIT $pid

Railsをdockerで動作させている場合でも、このスクリプトをコンテナ内に置いておけば、docker execでコンテナ外からunicornを再起動できます。