起動順を制御したい背景
先日、God + tig.rb 環境に移行したわけだけど1、実際には自分の irc 周りの環境は下の図のようになっている。
twitter
|
internet
|
+----+ +---+--+
|ircd| |tig.rb|
++--++ +---+--+
| | |
+--+ +-+ +---+
| | |
+---+--+ +-+--+-+
|nadoka| |tiarra|
+------+ +---+--+
|
LimeChat ( Mac or iPod )
拙い図だけど四角で囲んである部分は自宅サーバ内で動いているプログラムである。制御したいプログラムだけ抜き出すと、
tiarra | proxy |
nadoka | bot |
tig.rb | twitter gateway |
という構成になっている2。
そしてここからが大事なんだけど、
起動の順番としては tiarra がいちばん最後
である。
God 以前
God 化する前、これらは単に sh スクリプトから順番に起動するだけだった。
nadoka
sleep 2
tig.rb
sleep 2
tiarra
である。サーバサーバなんて偉そうに言っといて中身はこんなもの。途中で何かの拍子にどれかのプロセスが落ちたらそれだけまた起こし直す。全部手動で、厳密には daemon プロセスではなく
ただずっと起きっぱなし
の状態になっていた。サーバ管理的にはあまりに稚拙だが、こと起動順に関しては
書いた通りの順番に起動する
という分かりやすいものだった。しかし God 化してしまうとこうはいかない。
God の起動の流れ
0.8.0 で確認したところ、以下のようになっている。
- God.watch の指定を読み込めるだけ読み込む
- watch の name を key にとる Hash に放り込まれる
- 読み込み終わったら Hash から一つずつ取り出し、autostart を指定してあったら(default で true)ただちにプロセスの起動を行う
ということは少なくとも Ruby 1.8 では
God.load の読み込み順、God.watch の出現順とプロセスの起動順は無関係
である。
はて困ったな。
無理矢理解決してみた。
ここでは単にプロセスの起動順序だけを問題にしたいので tiarra や nadoka など実際に使ったプログラムではなく、先日の xig_installer で動かしやすくなった tig.rb と wig.rb で試したみた。
上の gist のファイルを適当な名前で保存して
god -c CONFIG
で起動すると
必ず wig.rb の方を後で起動することができる。
順番は
ps ax | grep ruby
して PID を確認すると分かる。
ポイント
- あとから起動したいものの God.watch の記述の中で autostart = false を加える
- watch 定義のあとに Thread.new {} の中で無理矢理待ちたいプロセスの起動を待つ
待ちたいプロセスの様子は God.status[NAME][:state] で確認することができる。
実は、こんな書き方でいいのか分かってない。本当はもっといい書き方、正しい書き方があるのかもしれない。探したけどまだまだ God の情報は少ないし、英語になるとどういう言葉でこれを探せばいいのかも分からない。
でも目的は達成できている。
参考 - God.load の流れ
God.load は指定された設定ファイルを読み込むものなんだけど、内部で Dir.glob を使っているので一つずつファイル名を指定しなくても
God.load File.dirname( __FILE__ ) + '/*.god'
なんて書き方でまとめて読み込むことができる。最終的には Kernel.load が呼ばれるので Ruby の文法に則っていないと、この時点で弾かれる。
最初、読み込み順でプロセスの起動順を制御できるかと思ったけど違ったのでこの部分の読み込みはあんまり活かしようがないのであった。残念。