Supervisor の始め方とポイント

ようやっと daemontools から Supervisor に乗り換えました。
ナウくていいですね。

ちょっとポイント書いていきます。

(バージョン: supervisor 3.1.2)

pip でインストール

# yum install python-setuptools
# easy_install pip
# pip install supervisor

epel リポジトリにもありますが、若干古いので pip で入れることにしました。
EPEL5/6 だと 2.1、EPEL7 だと 3.0 が入りました。 (2014/10/21)

基本設定と起動

メイン部分 (Supervisor 自体) の設定と、管理する子のプログラムの設定はファイルを分けるのが僕のポリシーです。
/etc/supervisord.d 以下に置いた conf ファイル 1 つにつき [program:x] セクションを 1 つ書く感じが良いかなと思います。

メイン部分の設定

/etc/supervisord.conf

[unix_http_server]
file=/var/run/supervisor.sock

[supervisord]
logfile=/var/log/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=65536
minprocs=200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files=/etc/supervisord.d/*.conf

ちなみに、minfds を書いておけば、子プロセスの Max open files もその値になっていました。
(user パラメータで動作ユーザを変更していても OK っぽい)

自動起動設定

supervisord のために起動スクリプトを書くのもツラいので、下記で起動することに。

# echo 'supervisord -c /etc/supervisord.conf' >> /etc/rc.d/rc.local

起動

# supervisord -c /etc/supervisord.conf

子のプログラムの設定

だいたいの物は下記を書いておけば事足りるかなと思います。
stdout と stderr は指定しておかないと /tmp 以下に吐かれるので注意。

/etc/supervisord.d/hoge.conf

[program:hoge]
command=/bin/cat
autostart=true
autorestart=true
user=nobody
directory=/tmp
stdout_logfile=/var/log/supervisord/%(program_name)s_stdout.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=5
stderr_logfile=/var/log/supervisord/%(program_name)s_stderr.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=5

あとは下記あたりが使えそうです。(値はデフォルト値)
stopwaitsecs はデフォルトが 10 秒なので、InnoDB buffer pool dump 等、終了に時間かかる場合は長めにしておくといいかもしれません。

  • startsecs=1
    • 起動成功と判定する秒数
    • この時間以内に exitcodes に示した終了コードで終わっても、失敗と判定する
    • 判定不要なら 0 を指定
  • startretries=3
    • 起動失敗した時のリトライ数
  • exitcodes=0,2
    • 正常終了とみなす終了コード (カンマ区切り)
  • stopsignal=TERM
    • 終了するときに使うシグナル
  • stopwaitsecs=10
    • この時間内にプロセスが終了しない場合、KILL が送られる
  • killasgroup=false
    • KILL をプロセスグループ全体に送るかどうか

操作

セクションを変更した場合、reread してから各種操作 します。

子のプログラムの追加

[program:hoge] セクションを追加したときに、supervisord を再起動せずに反映する方法です。
早まって supervisorctl reload すると supervisord 自体が再起動するというトラップがあるので注意です。(ごめんなさいちゃんと help には書いてあります。)

# vi /etc/supervisord.d/hoge.conf   # <- 追加
# supervisorctl reread
hoge: available
# supervisorctl add hoge
hoge: added process group

子のプログラムの更新

引数や動作ユーザの変更等、[program:hoge] セクションの更新をしたときに、supervisord を再起動せず(ry
いきなり update でも良いですが、まずは reread で変更されたコンフィグを表示して確認するのが良いです。

# vi /etc/supervisord.d/hoge.conf   # <- 更新
# supervisorctl reread
hoge: changed
# supervisorctl update hoge
hoge: stopped
hoge: updated process group

子のプログラムの削除

[program:hoge] セクションを削除するときに(ry

# supervisorctl stop hoge
hoge: stopped
# rm -i /etc/supervisord.d/hoge.conf   # <- 削除
# supervisorctl reread
hoge: disappeared
# supervisorctl remove hoge
hoge: removed process group

  • 初稿 (Wed Oct 22 00:15:38 JST 2014)