@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Tiarra を monit 配下で動かす

Tiarramonit 配下で動かしてみた。ありそうなのになぜかぐぐっても例が見つからなかったのでメモ。環境はさくらの VPS (CentOS 5.5)。 Tiarra は Perl で書かれた IRC Proxy で、 monit はプロセス監視ツール。

Tiarra の導入と設定

CodeRepos から落としてきて適当に tiarra.conf を書き換える。 ./tiarra --make-password とかも忘れずに。

$ svn co http://svn.coderepos.org/share/lang/perl/tiarra/trunk/ tiarra
$ cp tiarra/sample.conf tiarra/tiarra.conf
$ editor tiarra/tiarra.conf
$ perl tiarra/tiarra --config=tiarra/tiarra.conf

tiarra.conf の書き方とかはコメント読めばなんとかなる。あとはぐぐる。ちゃんと起動して LimeChat あたりから接続できれば ok。

monit の導入と設定

ふつうに yum なり apt なりで入れる。

# yum install monit

monit の設定は主に以下のページを参考にした。

daemontools に慣れてるからなのか、設定方法というか monit.conf の書式とかがとっつきづらく感じた。というか monit.conf の書き方がわからなくて何度か挫折してて今回やっと成功した。でも 2010 年にもなって daemontools もなぁと (いや使ってもいいと思いますけど) いうことで新しいものに挑戦してみた。

設定ファイルは /etc/monit.conf にあり、 /etc/monit.d/*.conf をインクルードする (/etc/monit.conf のなかに include がある) ので、 /etc/monit.d/tiarra.conf を作ってそこに書いた。絶対パスがどうにもダサイ。

check process tiarra with pidfile /home/kyanny/tiarra/tiarra.pid
    start program "/home/kyanny/tiarra/tiarra-run start"
    stop  program "/home/kyanny/tiarra/tiarra-run stop"
    if failed port 6667 then restart

pidfile を指定しなくてはならないのと start|stop program がないといけないので適当なシェルスクリプトを書く、のが流儀らしい。ということで適当にでっちあげた。これまた絶対パスがダサイ。 monit の FAQ として、環境変数 PATH とかをいじられてしまうので自分で env とか使って読み込ませるとか工夫が必要らしい。そういうのも面倒なので絶対パスで書いた。

#!/bin/sh

case $1 in
        start)
                /home/kyanny/tiarra/tiarra --config=/home/kyanny/tiarra/tiarra.conf >/dev/null 2>&1 &
                echo $! > /home/kyanny/tiarra/tiarra.pid
                ;;
        stop)
                kill `cat /home/kyanny/tiarra/tiarra.pid`
                rm /home/kyanny/tiarra/tiarra.pid
                ;;
        *)
                echo "usage: tiarra-run {start|stop}"
                ;;
esac
exit 0

あと tiarra は pid をファイルに書き出したりしないっぽいので、 $! (最後に起動したバックグラウンドプロセスの pid) をファイルに吐き出すようにして、それを monit の設定で指定しておく。起動中の tiarra プロセスを行儀良く殺す方法もよくわからなかったので普通に kill で。しかし stop のほうは monit そのものを停止するときくらいしか呼ばれない気がする。まぁ monit.conf を書き換えることもあるだろうから必要ではある。 $! の別解として $$ を吐き出しておいて exec するというのもあり公式サイトではこちらが紹介されていた。それから monit の FAQ として pidfile が存在しっぱなしになるのも良くないらしいので一応 stop で消すようにしてある (けど tiarra プロセスが突然死したときは残るしなぁ)

そして monit を起動する。無事に起動して、 tiarra プロセスも起動すれば ok。ちなみに monit のログは /var/log/monit とかに吐かれる (/etc/monit.d/logging をみよ)

# /etc/init.d/monit start

ログを tail しながら tiarra プロセスを kill したりすると、 monit が勝手に起動しなおしてくれる様子がわかる。うまくいかないときは環境変数まわりでラッパーのシェルスクリプトが monit から正常に実行できてないとかがあやしい (けどログに詳しくでないのでめんどい)

そして最後に monit プロセスそのものが死ぬと配下のものが再起動してこなくて困るので monit が死んだら init に再起動させるようにする。そのためには monit.conf のなかで set init というのを有効にして /etc/inittab に追記して inittab を再読込させる。

monit.conf

set init

/etc/inittab

# monit
mo:2345:respawn:/usr/bin/monit -Ic /etc/monit.conf
# /etc/init.d/monit stop # monit プロセスを落としておく
# telinit q

これで monit プロセス自体を kill しても自動で再起動してくれる。しかし monit -Ic の I と set init は同じような意味に思えて片方でいいんじゃないかという気もするが両方あっても動いてるのでまぁよしとする。しょせん Tiarra 用だし。