unicornで走るrailsアプリケーションをデバッグする

unicornでバックグランドで走るようになっている場合、普通のpryのようなブレークポイントを置いて、対話型のインターフェースでデバッグすることが出来ない。

これを可能にできそうだったのが
blog.hello-world.jp.net
これだった。

(バイト先では権限がなくて新しいライブラリをインストールできるか微妙なのだが、)さっそく使ってみるべく、自宅のパソコンにもunicornを導入して、pry_remoteをインストールしてみた。
unicornの導入自体は
qiita.com
このページの前半を参考にやった。ただし、Unicornの起動に必要なrake unicorn:startに対してrake unicorn:stopがうまく使えなかったので、

ps -ef | grep unicorn
kill -QUIT xxxxx

でプロセスを確認しながら止めた。

pry_remoteも公式の説明と同様に入れたが、pry-byebugを消さなくても使用することが出来た。

require 'pry-remote'

class WelcomeController < ApplicationController
    def index
        @parameter = "This is my website"
        binding.remote_pry
    end
end

これで、そのページへのアクセスをかけた際に、

bendle exec pry-remote

ブレークポイントを見に行くことが出来る。(ロード中に行わないとエラーになる。)

このpry_remoteの最大の弱点はビューにブレークポイントが置けないことで、pryに比べるとだいぶ使い勝手が悪くなる。exitをつかったステップ実行には対応していなくて、exitでインターフェースから抜け出して、再度pry-remoteする必要がある。

また、動作もやや不安定に思われる。(一度入力しても反応がないなど。)

rails sでフォアグランドで走らせて通常のpryを使うのが最も効率の良い方法だと感じてしまった。そのためにはバックグランドで走るNginXとUnicornのプロセスを殺す必要がある。この2つのプロセスを殺して、果たしてアプリケーションがちゃんと動くのか、デバッグの後、ちゃんと両方のプロセスを再スタートできるのかが心配。

バックグラウンドでの動作を維持しながら、別のポートでフォアグラウンドで実行する方法はないものか。

もうちょっと手軽な代替案のしては、現行で使っているlogger.debugを使いつつ、出力先を新しいファイルにすることで、

require 'logger'

log = Logger.new('/tmp/log')

で、新しいloggerのインスタンスを作成して新しいログの保存先を指定する。これで、他のロガーの残したログとの混乱を避けることが出来る。