バリケンのRuby日記 RSSフィード

2006-06-11

[] QuickMLソースコードを読む(4) /usr/sbin/quickmlの続き  QuickMLのソースコードを読む(4) /usr/sbin/quickmlの続き - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  QuickMLのソースコードを読む(4) /usr/sbin/quickmlの続き - バリケンのRuby日記  QuickMLのソースコードを読む(4) /usr/sbin/quickmlの続き - バリケンのRuby日記 のブックマークコメント

昨日のエントリの続きだよ。ようやくこれで/usr/sbin/quickmlを読み終えたことになるね。

mainメソッド

def main (argv)
  config_file = if argv.length == 1 then
                  argv.first
                else
                  File.join("/etc/quickml", "quickmlrc")
                end
  config = QuickML::Config::load(config_file)
  check_directory(config.data_dir)

  be_daemon
  be_secure(config)

  server  = QuickML::Server.new(config)
  sweeper = QuickML::Sweeper.new(config)
  trap(:TERM) { server.shutdown; sweeper.shutdown }
  trap(:INT)  { server.shutdown; sweeper.shutdown }
  trap(:HUP)  { config.logger.reopen }
  t = Thread.new { sweeper.start }
  t.abort_on_exception = true
  server.start
end
main(ARGV)

最後にmain(ARGV)でmainメソッドをARGVコマンドライン引数)を引数として呼び出しているから、結局このスクリプトメイン部分はこのmainメソッドということになるね。

まず初めに、コマンドライン引数がひとつの場合はその引数として得られた文字列を、そうでなければ"/etc/quickml/quickmlrc"という文字列をconfig_fileとしている(文字列オブジェクトにconfig_fileラベルを貼り付ける)んだね。

次に、QuickML::Config::loadメソッド(loadメソッドはQuickML::Configクラスクラスメソッドで、/usr/lib/ruby/1.8/quickml/config.rbで定義されているよ)で、config_file文字列を引数として実行するとその文字列で指定したファイルを読み込んでQuickML::Configオブジェクトが生成されるみたい。

次におとといの日記で定義したcheck_directoryメソッドでconfig.data_dirディレクトリQuickML::Config#data_dirによるアクセサでインスタンス変数を読んでいる)の存在を確認して、おとといの日記で定義したbe_daemonメソッドでデーモン化、昨日の日記で定義したbe_secureメソッドでプロセスファイルの権限を安全なものに変更しているよ。

次に、QuickML::ServerクラスインスタンスQuickML::SweeperクラスインスタンスconfigオブジェクトQuickML::Configクラスインスタンス)を引数として生成しているよ。QuickML::Serverクラスは/usr/lib/ruby/1.8/quickml/server.rbで、QuickML::Sweeperクラスは/usr/lib/ruby/1.8/quickml/sweeper.rbで定義されているみたい。

ちなみにQuickML::ServerクラスインスタンスQuickMLメーリングリストサーバ自体、QuickML::Sweeperクラスインスタンスは、「あと○日投稿がないとメーリングリストが消滅します」とか、その○日後までに投稿がなかったときに実際にメーリングリスト削除したりとかいった処理をしているみたいだよ。

その次にKernel#trapメソッドでTERMトラップ、INTトラップ、HUPトラップを受けたときのそれぞれの挙動を定義しているよ。具体的にはTERMかINTトラップを受けたらserverとsweeperを停止(QuickML::Server#shutdownメソッド、QuickML::Server#sweeperメソッド)、HUPトラップを受けたらlogファイルを開きなおす(QuickML::Config#loggerメソッド(アクセサ)でアクセスしたQuickML::Loggerオブジェクトに対して、QuickML::Logger#reopenメソッドを使って開きなおしている)、という動作をするみたい。

その次に別スレッドでsweeperを起動(QuickML::Sweeper#startメソッド)して、Thread#abort_on_exception=メソッドによってスレッドが例外によって終了した時にはインタプリタ全体を中断するように設定しているよ。

最後にQuickML::Server#startメソッドでサーバを起動しているよ。

この/usr/sbin/quickmlを読むと、なんとなくこのスクリプト全体の挙動はわかったような気がするよ。

とりあえず今日はここまで。うーん、全部読むのは大変そう。読むポイントを絞ったほうがいいかな?

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060611