前提
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 は停止されずに動作し続けることになる.
どうしたものかと考えていたら先述の解決策に辿り着いたため,起動スクリプトから呼ばれるプロセスの停止に関する問題の解決策は未調査である.