Supervisorでプロセスをデーモン化(環境変数の設定問題)

30分くらい書いていたやつが消えてしまったので、簡単にまとめる...。

自宅macで管理しているjenkinsやirc bot(ikachan)の死活管理を簡単にしたい。今は調子が悪くなっていないか死んでいないかをmackerelで監視しているが、そもそも死んだら再起動して欲しい。その用途に適したSupervisorというツールを入れてみた。設定はほとんど以下の通り。

これで大体解決なのだが、Supervisorはシェルの環境変数を見てくれないので、設定ファイル毎に書く必要がある。私の場合はdirenvでPATHを含む環境変数を整理するようにしているため、direnvとSupervisorの設定ファイルで環境変数を管理することになると面倒だし、地獄でしかない*1

色々試行錯誤した末、割と簡単にうまく行ったのでメモしておく。commandのところがミソ。

[program:jenkins]
command=zsh -c 'direnv exec . java -jar jenkins.war'
directory=%(ENV_HOME)s/Downloads
user=yasuhisa
numprocs=1
stdout_logfile=/tmp/jenkins_out.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3
stderr_logfile=/tmp/jenkins_err.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=3
autostart=true
autorestart=true

zsh -c 'cmd...'.zshenvから環境変数を読んでcmdを実行するやり方。これでPATHが通ってdirenvが見えるようになる。direnv exec .はdirenvに設定している環境変数を今のプロセス(?)でも設定した上でコマンドを実行するやり方。二重になっていて冗長っぽいが、今までのやり方を大きく変えなくてよさそうなので、これでひとまず運用してみる。

*1:特にjenkinsに関連しているジョブは環境変数から色々読ませている