supervisorを使ってスクリプトを簡単にdaemon化

こんにちは、mi2yo4です。
今日は台風が丁度真上を通過していったようです。
いきなりの襲来だったので心の準備が出来ていなかったのですが…自分の周りでは大した被害が無く、ホッとしているところです。

さて、先日スクリプトのdaemon化ツールの紹介をしました
あの記事を書いた直後ぐらいに、supervisorというdaemon化ツールを見つけまして、
最近になって改めて使ってみると「これ使いやすいかもしれない…」という事で今回のエントリで紹介します。
(元エントリにもこちらへの記事のリンクを貼っておきました)

supervisorのインストール

今回は手持ちのFedora Core18という古いマシンにお試しとしてsupervisorをインストールしてみました。
そのままyum installしてしまうと、supervisor2系がインストールされてしまうので、src.rpmからbuild、installを行っています。

まずはsrc.rpmを以下からダウンロードしてきました。

ftp://ftp.cc.uoc.gr/mirrors/linux/fedora/linux/development/rawhide/source/SRPMS/s/supervisor-3.1.3-3.fc24.src.rpm

Fedora Core 24用ですが、試してみたところインストール出来るようです。
また、buildの際にrpmbuild,python-develが必要になるので、それも事前にインストールしておきましょう。

$ rpmbuild --rebuild supervisor-3.1.3-3.fc24.src.rpm 
# yum localinstall /home/mi2yo4/rpmbuild/RPMS/noarch/supervisor-3.1.3-3.fc18.noarch.rpm 

supervisorの設定

インストールすると/etc/supervisord.confと/etc/supervisord.d/が作成されます。
(無ければ作ってください)

好みの問題ですが、/etc/supervisord.confの最後の行を以下のように変更します。
変更前

[include]
files = supervisord.d/*.ini

変更後

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

…単にiniファイルじゃなくてconfファイルとして扱いたいなぁ、という意味合いですね。

次にdaemon化したいスクリプトについての設定ファイルを/etc/supervisord.d/以下に作成します。
今回はboxserverというスクリプトをdaemon化しました。

/etc/supervisord.d/boxserver.confの中身

[program:boxserver]
command = /usr/bin/php /home/mi2yo4/bin/boxserver.php
process_name = boxserver
autostart = true
autorestart = true
stopasgroup = true

autostartをtrueにすると、supervisorが起動した時点で自動的にboxserverも起動するようになります。
autorestartをtrueにすると、何らかの原因でboxserverが終了したとしても再起動してくれるようになります。
stopasgroupをtrueにすると、起動しているスクリプトの子プロセスまでまとめて面倒を見てくれます。これは結構嬉しい機能です。

参考:
Sending SIGKILL to supervisord does not terminate children
supervisord stopping child processes

(追記)
stopasgroupは3.0a13以降のバージョンで有効になるとの事です。
上手く子プロセスが停止しないよ~、という方はsupervisorのバージョンを確かめて下さい。3.1以降を使うのが確実ですね。

supervisorの使い方

以上の設定を行って、いよいよsupervisorを使えるようになりました。

supervisorの起動

/usr/bin/supervisord

/etc/init.d/以下にsupervisordがあるかな?と思いましたが、どうやらなかったようなので上記コマンドで起動です。
そのうちrc.local等に記述すれば良いかな…

現在のステータスの確認

supervisorへ指令を送るにはsupervisorctlを使用します。
まずは現在のステータスを見てみましょう。

[root@local supervisord.d]# supervisorctl status
boxserver                        RUNNING   pid 25648, uptime 0:01:51

上は1個しかdaemonが起動していませんが、いくつも設定しておくと一覧となって表示されるようです。

試しに上記boxserverプロセスを外部からkillしてみると…次の瞬間にはちゃんと復活しました。
これは便利です。この機能のために乗り換えてもいいかもしれません。

ちなみにdaemonを停止させたい場合は以下のコマンドを使います。

supervisorctl stop boxserver

今日のまとめ

今日はsupervisorのさわり部分だけを紹介しましたが、これだけでも結構便利に使えそうです。
start-stop-daemonを使う、と言っていましたが、こっちの方がシンプルで良いかも…と迷い始めましたw

それではまた!