WEBrickの停止をフックする

前回プロファイリングの話で、当初はプロファイリングの終了をサーバの停止のタイミングで行いたいと考えていました。(結局その必要は無かったのですが)

その際に調べてみると、WEBrickはStopCallbackというコールバックを登録しておくことで、サーバ終了時に任意のコードを実行することができるようになっています。

ただ、rails-2.1.1のコードを見る限り、rails側からこのStopCallbackを登録する術が無いようで、結局うまい解決方法が見つからず、直接webrickのコードを修正してStopCallbackを登録できるようにしてみました。

@ubuntu:/usr/local/ruby-1.8.7-p72/lib/ruby/gems/1.8/gems/rails-2.1.1/lib# diff -u webrick_server.rb.org webrick_server.rb
--- webrick_server.rb.org       2008-09-15 19:57:55.000000000 +0900
+++ webrick_server.rb   2009-07-05 13:04:34.000000000 +0900
@@ -54,6 +54,7 @@
                :ServerType  => options[:server_type],
                :BindAddress => options[:ip] }
     params[:MimeTypes] = options[:mime_types] if options[:mime_types]
+    params[:StopCallback] = options[:StopCallback] if options[:StopCallback]
 
     server = WEBrick::HTTPServer.new(params)
     server.mount('/', DispatchServlet, options)

rails側からStopCallbackを指定するには、RAILS_ROOT/config/environment.rbあたりに、以下のようなコードを記述します。

# Bootstrap the Rails environment, frameworks, and default configuration       
require File.join(File.dirname(__FILE__), 'boot')
# ここから
OPTIONS[:StopCallback] = Proc.new do
  puts "called StopCallback"
end
# ここまで

script/serverでWEBrickを起動し、CTRL+cで停止すると、StopCallbackが呼ばれていることが確認できます。

masayuki@ubuntu:~/work/rails/shrimp$ script/server
=> Booting WEBrick...
=> Rails 2.1.1 application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2009-07-05 13:23:06] INFO  WEBrick 1.3.1
[2009-07-05 13:23:06] INFO  ruby 1.8.7 (2008-08-11) [i686-linux]
[2009-07-05 13:23:06] INFO  WEBrick::HTTPServer#start: pid=2853 port=3000
[2009-07-05 13:23:08] INFO  going to shutdown ...
called StopCallback
[2009-07-05 13:23:08] INFO  WEBrick::HTTPServer#start done.

ただし、プロセスをkillされるとどうにもなりませんが。