supervisorでプロセス管理

このエントリーをはてなブックマークに追加
はてなブックマーク - supervisorでプロセス管理
Share on Facebook
Post to Google Buzz
Bookmark this on Yahoo Bookmark
Bookmark this on Livedoor Clip
Share on FriendFeed
supervisorでプロセス管理Borders Labs

こんにちは。

ボーダーズの冨永です。

今回、supervisorを使ってjob管理するまでの具体的な手順を紹介したいと思います。

ちなみにsupervisorとは、python製のプロセス管理ツールで、おもに

  • プロセスの生死の監視する
  • プロセスが死んだら勝手に再起動する
  • 標準出力やエラー出力のログを取る
  • 場合によっては複数プロセスを起動したい
  • プロセスのステータスを簡単に確認したい

といったことに使えます。

具体的な使用例としては、弊社安里が紹介しているジョブキューイング 等を管理するツールとしての使用が挙げられます。

合わせて閲覧いただければ。

参考記事

supervisorのinstall

easy_install supervisor

上記コマンドでsupervisorがinstallされる。 設定ファイルを作る

echo_supervisord_conf > /etc/supervisord.conf

/etc/supervisord.confにsupervisorの設定が書き出される

設定をちょいちょい必要に合わせて変更する。自分の設定をデフォルトと比べるとこんな感じ

echo_supervisord_conf | diff - /etc/supervisord.conf
< ;[inet_http_server] ; inet (TCP) server disabled by default
< ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
---
> [inet_http_server] ; inet (TCP) server disabled by default
> port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
22c22,23
< logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
---
> ;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
> logfile=/var/log/supervisord/supervisor.log ; ログディレクトリを/var/log/以下に
26c27,28
< pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
---
> ;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
> pidfile=/var/run/supervisord/supervisor.pid ; pidディレクトリを/var/run/以下に
47c49
< ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
---
> serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
138,139c140,141
< ;[include]
< ;files = relative/directory/*.ini
---
> [include]
> files = /etc/supervisord.d/*.ini ; supervisord.d以下の設定を読み込む

設定に合わせてディレクトリを作成

  • supervisorで管理するプロセス設定ファイルのディレクトリ
mkdir /etc/supervisord.d
  • pidファイル生成ディレクトリ
mkdir /var/run/supervisord
  • ログディレクトリ
mkdir /var/log/supervisord

supervisorは

supervisord

ってコマンド打てば起動するけどsupervisor知らない人も使う場合そんなん知りませんやんって話になりかねんのでinit.d以下に実行ファイルを作成

vi /etc/init.d/supervisord

こんな感じ

#!/bin/bash
#
# supervisord  Startup script for the Supervisor
#
# chkconfig: - 70 60
# description: Supervisor is a client/server system that allows its users to \
#              monitor and control a number of processes on UNIX-like operating systems.
# processname: supervisord
# config:  /etc/sysconfig/supervisord
# pidfile: /var/run/supervisor/supervisor.pid
#
### BEGIN INIT INFO
# Provides: supervisord
# Short-Description: start and stop Supervisor
# Description: Supervisor is a client/server system that allows its users to
#  monitor and control a number of processes on UNIX-like operating systems.
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/supervisord ]; then
    . /etc/sysconfig/supervisord
fi

supervisord=${SUPERVISORD-/usr/bin/supervisord}
prog=supervisord
pidfile=${PIDFILE-/var/run/supervisord/supervisor.pid}
lockfile=${LOCKFILE-/var/lock/subsys/supervisord}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-3}

start() {
    echo -n $"Starting $prog: "
    daemon $supervisord --pidfile=${pidfile}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} -d ${STOP_TIMEOUT} $supervisord -QUIT
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

restart() {
    echo -n $"Reloading $prog: "
    killproc -p $pidfile $supervisord -HUP
    RETVAL=$?
    echo

#!/bin/bash
#
# supervisord  Startup script for the Supervisor
#
# chkconfig: - 70 60
# description: Supervisor is a client/server system that allows its users to \
#              monitor and control a number of processes on UNIX-like operating systems.
# processname: supervisord
# config:  /etc/sysconfig/supervisord
# pidfile: /var/run/supervisor/supervisor.pid
#
### BEGIN INIT INFO
# Provides: supervisord
# Short-Description: start and stop Supervisor
# Description: Supervisor is a client/server system that allows its users to
#  monitor and control a number of processes on UNIX-like operating systems.
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/supervisord ]; then
    . /etc/sysconfig/supervisord

    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status -p ${pidfile} $supervisord
        RETVAL=$?
        ;;
    restart)
        stop
        start
        ;;
    reload)
        reload
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|reload|status}"
        RETVAL=2
esac

exit $RETVAL

さっき作ったディレクトリとかの設定がここに書いてあるものと違うと怒られるので注意。

これで

起動

/etc/init.d/supervisord start

停止

/etc/init.d/supervisord stop

リスタート

/etc/init.d/supervisord restart

ができるようになった。どのタイミングで起動させるかはインフラチームと要相談で。

ここまで終わったところでLaravelのartisanコマンドをsupervisorで管理する設定ファイルを作る

vi /etc/supervisord.d/laravelqueue.ini

さっき作った/etc/supervisord.d/ディレクトリ以下にsupervisorに管理してほしいプロセスの設定ファイルをつくる。

中身はこんな感じ

[program:laravelqueue]
command=php artisan queue:listen ; 管理するコマンド。今回はキューなのでこんな感じ
directory=Laravelプロジェクト ;上記コマンドを実行するディレクトリ。上記commandのartisanの場所を指定しても可
stdout_logfile=Laravelプロジェクト/app/storage/logs/laravelqueue_supervisord.log ; supervisorのログを管理するファイル。
redirect_stderr=true
process_name=%(program_name)s_%(process_num)02d
numprocs=5 ; ワーカーを**プロセス起動する。今回は5
autostart=true ; supervisord起動時に自動的に起動する
autorestart=true ; プロセスが死んでも自動的に起動する
user=root ; コマンドを実行するユーザー。お好みで変更してちょ

stdout_logfileはsupervisorがこのプロセスを実行した際にログをはくファイルを指定。

vi Laravelプロジェクト/app/storage/logs/laravelqueue_supervisord.log

という感じで作っておく。

これで準備完了。

supervisorを起動してみる

/etc/init.d/supervisord start

問題なければこんな感じの表示が

Starting supervisord: /usr/lib/python2.6/site-packages/supervisor-3.0-py2.6.egg/supervisor/options.py:295: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  'Supervisord is running as root and it is searching '
                                                           [  OK  ]

プロセスが実行されているか確認してみる

supervisorctl status

こんな感じに

laravelqueue:pointqueue_00   RUNNING    pid 25309, uptime 0:01:12
laravelqueue:pointqueue_01   RUNNING    pid 25308, uptime 0:01:12
laravelqueue:pointqueue_02   RUNNING    pid 25307, uptime 0:01:12
laravelqueue:pointqueue_03   RUNNING    pid 25306, uptime 0:01:12
laravelqueue:pointqueue_04   RUNNING    pid 25310, uptime 0:01:12

ためしに1プロセスkillしてみる

kill 25310

確認すると

supervisorctl status
laravelqueue:pointqueue_00   RUNNING    pid 25309, uptime 0:02:16
laravelqueue:pointqueue_01   RUNNING    pid 25308, uptime 0:02:16
laravelqueue:pointqueue_02   RUNNING    pid 25307, uptime 0:02:16
laravelqueue:pointqueue_03   RUNNING    pid 25306, uptime 0:02:16
laravelqueue:pointqueue_04   RUNNING    pid 25911, uptime 0:00:02

pid 25911として復活してる。やっほい。

おわりに

今回はsupervisorを使う設定について、かなり具体的に書いてみました。 普段はコード書いててインフラツールとかになじみのない方が、なんらかの理由で(あると思います)設定しなければいけなくなったとき、参考にしていただければ。

カテゴリー: ご挨拶   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

* Copy This Password *

* Type Or Paste Password Here *

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>