supervisorでデーモンプロセスを管理する
ディストリビューションで用意されていないパッケージをデーモン化したい場合、supervisorが便利です。init scriptを書くという面倒な作業をやらなくても簡単にデーモン化できます。それだけでなく、プロセスが終了してしまった場合に自動的に起動したり、一定数のプロセスを維持したり、標準出力のログをローテーションしたりといった便利な仕組みが用意されています。
インストール
ここではRHEL 6 + EPELを前提とします。他のディストリビューションでもだいたい同じかと思います。
easy_installもしくはpipで最新版をインストールします。
sudo yum install python-pip sudo pip-python install supervisor
supervisorのinit scriptはGitHubの公式リポジトリに用意されています。
git clone git://github.com/Supervisor/initscripts.git cd initscripts/ sudo cp redhat-init-jkoppe /etc/init.d/supervisord sudo cp redhat-sysconfig-jkoppe /etc/sysconfig/supervisord sudo chkconfig --add supervisord
設定
設定ファイルを書きます。
; /etc/supervisord.conf ; http://supervisord.org/configuration.html [unix_http_server] file=/var/run/supervisor.sock [supervisord] logfile=/var/log/supervisord.log loglevel=info pidfile=/var/run/supervisord.pid ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock
supervisordで管理するデーモンの設定を書いていきます。この設定は supervisord.conf に追記するか、もしくは個別の設定ファイルをincludeするようにもできます。
[program:fluentd] command=/usr/local/rbenv/shims/fluentd -c /etc/fluentd.conf --user fluentd redirect_stderr=true stdout_logfile=/var/log/fluentd.log user=fluentd [program:motion] command=/usr/local/motion/bin/motion redirect_stderr=true stdout_logfile=/var/log/motion.log user=motion
上記の例では fluentd と motion を設定しています。
- commandで指定するプログラムはフォアグラウンドで実行する(デーモン化しない)ように設定してください。
- redirect_stderr を有効にすると、標準エラーの内容も合わせてログファイルに記録します。
- user を指定するとユーザで実行します。もし指定しない場合は root で実行されます。
supervisorの詳しい設定項目は Configuration File — supervisor 3.1a1-dev documentation を参照してください。
使ってみる
supervisorを開始します。
sudo service supervisord start
motionデーモンだけ停止したい場合は以下のように実行します。
sudo supervisorctl stop motion
デーモンの状態を確認するには以下のように実行します。
sudo supervisorctl status
ps axfuで見ると以下のような感じです。
root 23692 0.0 0.2 197020 11756 ? Ss Feb02 2:15 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf root 10936 0.0 0.4 199004 17836 ? Sl Feb06 0:00 \_ /usr/local/rbenv/versions/1.9.3-p374/bin/ruby /usr/local/rbenv/versions/1.9.3-p374/bin/fluentd -c /etc/fluentd.conf --user fluentd fluentd 10957 0.1 0.5 407952 23028 ? Sl Feb06 4:28 | \_ /usr/local/rbenv/versions/1.9.3-p374/bin/ruby /usr/local/rbenv/versions/1.9.3-p374/bin/fluentd -c /etc/fluentd.conf --user fluentd motion 2131 8.5 2.8 266676 110936 ? Sl Feb06 243:13 \_ /usr/local/motion/bin/motion