前提

mkdir /path/to/hoge && cd $_
rbenv local 2.5.1
vim Gemfile
bundle install --path=vendor/bundle

/path/to/hoge 内にインストールした gem から起動するプロセスを supervisord で管理したい.シェルから起動する場合は /path/to/hoge で bundle exec hoge を実行すればよい.

解決策

  • command で, rbenv local で指定した ruby と同じバージョンの bundle の絶対パスを指定する
  • directory で, /path/to/hoge を指定する
; /etc/supervisord.d/hoge.ini

[program:hoge]
command=/usr/local/rbenv/versions/2.5.1/bin/bundle exec hoge
directory=/path/to/hoge
stdout_logfile=/var/log/hoge.log
stdout_logfile_backups=5
autostart=true
redirect_stderr=true

これで supervisorctl (start|stop|restart) など一通りのコマンドが動作する.

失敗

bundle exec hoge の起動スクリプトを作成して登録したところ,まず環境変数の問題で躓いた.

# /path/to/hoge/start.sh

#!/usr/bin/env bash
cd /path/to/hoge
bundle exec hoge
; /etc/supervisord.d/hoge.ini

[program:hoge]
command=/path/to/hoge/start.sh
stdout_logfile=/var/log/hoge.log
stdout_logfile_backups=5
autostart=true
redirect_stderr=true

sudo supervisorctl start hoge を実行したところ次のエラーが出た.

/path/to/hoge/start.sh: line 3: bundle: command not found

パスが通っていなさそうなので supervisord 経由で echo $PATH を実行した.

/sbin:/usr/sbin:/bin:/usr/bin

どうやら supervisord で起動するプロセスにはシェルの環境変数が渡されないらしい.

この問題は起動スクリプトでシェルの設定を読み込むことで解決した.

 # /path/to/hoge/start.sh

 #!/usr/bin/env bash
 cd /path/to/hoge
+source ~/.bashrc
 bundle exec hoge

これで hoge を起動できるようになったが,次は起動したプロセスを停止できない問題に躓いた.

sudo supervisorctl stop hoge を実行するとプロセスが停止されるが,今回の場合は停止されるのは起動スクリプトそのものであり,起動スクリプトから呼ばれたプロセスは停止されない.よって, hoge は停止されずに動作し続けることになる.

どうしたものかと考えていたら先述の解決策に辿り着いたため,起動スクリプトから呼ばれるプロセスの停止に関する問題の解決策は未調査である.