maehachi08 Anything Blog

2013年01月30日
デーモン管理のSupervisorインストール(ついでにgrowthforecastをデーモン起動)

Supervisorはデーモン管理ツールです。
似たようなプロダクトとしてはdaemontoolsやrunit等があります。

Installing pip

SupervisorはPython製プロダクトです。
公式ページのInstalling to A System With Internet Accessによると、Pythonパッケージ管理システムのsetuptoolsに含まれるeasy_installコマンドでインストールする手順が記載されていますが、easy_installを置き換える新しいプロダクト『pip』でインストールしてみます。
『pip』のインストールに関しては、以前記事を纏めましたので、
こちらを参照してインストールします。

Installing supervisor

pipが使えるようになったら、supervisorのインストールです。
インストールは以下のコマンドを実行します。

pip install supervisor

Create Configuration File

supervisorをインストールするとecho_supervisord_confコマンドがインストールされます。echo_supervisord_confコマンドは設定テンプレートを標準出力に出力します。それを/etc/supervisord.confにリダイレクトします。

echo_supervisord_conf > /etc/supervisord.conf

ここでは必要最低限の設定を行います。

cp -a /etc/supervisord.conf{,.original}
vim /etc/supervisord.conf

既定値からの編集結果のdiffは以下のとおりです。

--- /etc/supervisord.conf.original      2013-01-29 23:38:12.668975343 +0900
+++ /etc/supervisord.conf       2013-01-29 23:54:39.267869093 +0900
@@ -7,7 +7,7 @@
 ; variables can be expanded using this syntax: "%(ENV_HOME)s".

 [unix_http_server]
-file=/tmp/supervisor.sock   ; (the path to the socket file)
+file=/var/run/supervisor.sock   ; (the path to the socket file)
 ;chmod=0700                 ; socket file mode (default 0700)
 ;chown=nobody:nogroup       ; socket file uid:gid owner
 ;username=user              ; (default is no username (open server))
@@ -19,11 +19,11 @@
 ;password=123               ; (default is no password (open server))

 [supervisord]
-logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
+logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
 logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
 logfile_backups=10           ; (num of main logfile rotation backups;default 10)
 loglevel=info                ; (log level;default info; others: debug,warn,trace)
-pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
+pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
 nodaemon=false               ; (start in foreground if true;default false)
 minfds=1024                  ; (min. avail startup file descriptors;default 1024)
 minprocs=200                 ; (min. avail process descriptors;default 200)
@@ -43,7 +43,7 @@
 supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

 [supervisorctl]
-serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
+serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket
 ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
 ;username=chris              ; should be same as http_username if set
 ;password=123                ; should be same as http_password if set
@@ -135,5 +135,5 @@
 ; interpreted as relative to this file.  Included files *cannot*
 ; include files themselves.

-;[include]
-;files = relative/directory/*.ini
+[include]
+files = supervisord.d/*.ini

修正後の/etc/supervisord.confの有効行のみを抜き出した内容は以下のようになってます。

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket
[include]
files = supervisord.d/*.ini

make directory

/etc/supervisord.confで指定したパスの作成が必要ディレクトリを用意します。

mkdir /var/log/supervisor
mkdir /etc/supervisord.d

Upstart経由でSupervisorを起動

UpstartとはRHEL6系では主流になりつつあるイベントベースのinitシステムです。
Supervisorはデーモン管理ツールですが、肝心のSupervisorが落ちてしまうと意味がありませんので、Upstartジョブに登録しておくことでSupervisorが落ちたときに自動的に起動するようにします。
Upstartのジョブ登録を行うには/etc/initディレクトリ以下に設定ファイルを作成します。今回は以下内容で/etc/init/supervisord.confを作成しました。

description     "supervisord"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec /usr/bin/supervisord -n

Upstartジョブを起動にはinitctlコマンドを使用します。
supervisordをUpstart経由で起動するためには以下コマンドを実行します。

initctl start supervisord

これで、pkill supervisord等でプロセスを殺しても、すぐに再起動されてきます。

GrowthForecastをsupervisordで起動してみる

ともあれ、今の状態では何も楽しくありません。デーモン起動したいけど、自身でデーモン化の仕組みを持たないプロダクトや、デーモン化の仕組みはあれど”落ちたら再起動”の仕組みを持たないプロダクトをsupervisord経由で起動してみて初めてsupervisordの便利さが分かります。
今回はGrowthForecastを導入してみます。

### install dependency packages
# yum -y groupinstall "Development Tools"
# yum -y install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel

# mkdir /var/run/growthforecast
# chown -R growthforecast:growthforecast /var/run/growthforecast

### make user
# groupadd -g 10000 growthforecast
# useradd -g 10000 -u 10000 growthforecast

### install perlbrew

$ curl -kL http://install.perlbrew.pl | bash
$ echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bash_profile
$ . .bash_profile
$ perlbrew install perl-5.16.2
$ perlbrew switch perl-5.16.2
$ perlbrew install-cpanm
$ cpanm -n http://nomadscafe.jp/pub/GrowthForecast/GrowthForecast-0.35.tar.gz

以上でgrowthforecastをインストールできました。インストールパスを確認してみましょう。

$ which growthforecast.pl
~/perl5/perlbrew/perls/perl-5.16.2/bin/growthforecast.pl

growthforecastユーザのホームディレクトリ以下のperlbrewディレクトリ以下にインストールされました。
フォアグラウンドで起動してアクセスしてみましょう。

$ growthforecast.pl --port=5125

http://< IPアドレス >:5125/でアクセスするとgrowthforecastのトップページが表示されました。
続いて、supervisordでgrowthforecastを起動するための設定として/etc/supervisord.d/growthforecast.iniを作成します。

[program:growthforecast]
command=/home/growthforecast/perl5/perlbrew/perls/perl-5.16.2/bin/growthforecast.pl --port 5125
process_name=%(program_name)s
stdout_logfile_maxbytes=1MB
stderr_logfile_maxbytes=1MB
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
user=growthforecast
autostart=true
autorestart=true

root権限でsupervisord管理下のサービスにgrowthforecastを追加します。

supervisorctl add growthforecast
supervisorctl start growthforecast
supervisorctl status growthforecast

これでgrowthforecastがsupervisord経由でデーモン起動しました。