[Ruby] Sinatra アプリを Rack でデーモン化する際の注意点

Posted by on April 21, 2014 in Ruby, Tech

要約:
Sinatra アプリのデーモン化におけるトラブルとその解決策

結論

ソースコード中のパスをすべて絶対パスで記述しないとエラーとなる.

経緯

デーモン化したら動かない

Sinatra で作ったアプリを rackup -D コマンドによりデーモン化したところ,正常に動作しない.
アプリは internal server error を返し,プロセスは ps コマンドでも確認できない.
アプリが使うポートはわかっていたため, sockstat コマンドからプロセス番号を見つけて殺した.

とりあえず調べる

sinatra, rack, rackup, daemonize 等のキーワードで検索するも,同様のケースは見当たらない.
そして,サーバを Thin, Passenger, Unicorn 等にしてデーモン化するケースをよく見かける.

WEBrick を疑う

Sinatra 標準のサーバである WEBrick のケースを特に調べる.
そうするうちに以下の記事に辿り着く.

どうやらデーモンとして実行した際にはカレントディレクトリを / に移動するらしい.
というわけで,ソースコード中の相対バスをすべて絶対パスに書き換えると……動いた.

終わりに

Ruby プログラムをデーモン化する際には標準でカレントディレクトリを / に移動するものらしい.
当初の Sinatra, Rack といったキーワードだけにとどまる話ではなかったようで.
教訓:仕様書やソースコードはしっかりと読むこと.