GeekFactory

int128.hatenablog.com

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