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されるとどうにもなりませんが。