結論

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

経緯

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

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

とりあえず調べる

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

WEBrick を疑う

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

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

終わりに

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