puma のリスタートディレクトリに関する仕様

Published: 2021/11/30


puma で phased restart をするためには、その reload の際にシンボリックリンクを良い感じに解決してもらわねばならず、そこで若干ハマったので、それについてのメモ。

本文

Puma::Launcher#initialize において、 puma はリスタートのための情報を生成し(generate_restart_data)、移行 reload のタイミングではその値を利用する。(ソース)

https://github.com/puma/puma/blob/8833ca4bda02c23b71624bbadd1b3cc095c6b1bf/lib/puma/launcher.rb#L410-L431

上記において、具体的に restart_dir, つまりリスタートの際に利用するディレクトリを決定している。

この条件を書き下すと、

  1. 起動時のオプションなどで directory が指定されていれば、その値
  2. windows 系ではなく、かつ、 ENV['PWD'] の実態と実行時のカレントディレクトリが一致していれば、 ENV['PWD']
  3. それ以外ではカレントディレクトリ

となっている。(PWD とカレントディレクトリの違いについては、pwd とカレントワーキングディレクトリ(cwd)とシンボリックリンクを参照)

なので、 puma を起動するサービス等を記述する際には、

  • bash 等シェルの中から exec する、もしくは
  • カレントディレクトリと PWD 環境変数を適切に設定し、特に PWD にはシンボリックリンクの方を利用するようにする

とすることによって、 puma 自身の restart によってディレクトリがシンボリックリンクを辿って切り替わるようにすることが可能。


Tags: pumasymlink
Next: POSIX における環境変数の仕様について
Prev: Nuxt Content で KaTeX を利用する方法