トップ «前の日記(2010-01-18) 最新 次の日記(2010-01-20)» 編集

2010-01-19 [長年日記]

_ Godにプロセスの起動順序を教えたい

起動順を制御したい背景

先日、God + tig.rb 環境に移行したわけだけど*1、実際には自分の irc 周りの環境は下の図のようになっている。

               twitter
                   |
               internet
                   |
      +----+   +---+--+
      |ircd|   |tig.rb|
      ++--++   +---+--+
       |  |        |
    +--+  +-+  +---+
    |       |  |
+---+--+  +-+--+-+
|nadoka|  |tiarra|
+------+  +---+--+
              |
   LimeChat ( Mac or iPod )

拙い図だけど四角で囲んである部分は自宅サーバ内で動いているプログラムである。制御したいプログラムだけ抜き出すと、

tiarraproxy
nadokabot
tig.rbtwitter gateway

という構成になっている*2

そしてここからが大事なんだけど、

起動の順番としては tiarra がいちばん最後

である。

God 以前

God 化する前、これらは単に sh スクリプトから順番に起動するだけだった。

nadoka
sleep 2
tig.rb
sleep 2
tiarra

である。サーバサーバなんて偉そうに言っといて中身はこんなもの。途中で何かの拍子にどれかのプロセスが落ちたらそれだけまた起こし直す。全部手動で、厳密には daemon プロセスではなく

ただずっと起きっぱなし

の状態になっていた。サーバ管理的にはあまりに稚拙だが、こと起動順に関しては

書いた通りの順番に起動する

という分かりやすいものだった。しかし God 化してしまうとこうはいかない。

God の起動の流れ

0.8.0 で確認したところ、以下のようになっている。

  1. God.watch の指定を読み込めるだけ読み込む
    • watch の name を key にとる Hash に放り込まれる
  2. 読み込み終わったら 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 を確認すると分かる。

ポイント

  1. あとから起動したいものの God.watch の記述の中で autostart = false を加える
  2. watch 定義のあとに Thread.new {} の中で無理矢理待ちたいプロセスの起動を待つ

待ちたいプロセスの様子は God.status[NAME][:state] で確認することができる。

実は、こんな書き方でいいのか分かってない。本当はもっといい書き方、正しい書き方があるのかもしれない。探したけどまだまだ God の情報は少ないし、英語になるとどういう言葉でこれを探せばいいのかも分からない。

でも目的は達成できている。

参考 - God.load の流れ

God.load は指定された設定ファイルを読み込むものなんだけど、内部で Dir.glob を使っているので一つずつファイル名を指定しなくても

God.load File.dirname( __FILE__ ) + '/*.god'

なんて書き方でまとめて読み込むことができる。最終的には Kernel.load が呼ばれるので Ruby の文法に則っていないと、この時点で弾かれる。

最初、読み込み順でプロセスの起動順を制御できるかと思ったけど違ったのでこの部分の読み込みはあんまり活かしようがないのであった。残念。

*1 現時点ではその日記は書いてないです!

*2 本当は ircd も含めて制御すべきだと思うけど、まだやってない。