前回プロファイリングの話で、当初はプロファイリングの終了をサーバの停止のタイミングで行いたいと考えていました。(結局その必要は無かったのですが)
その際に調べてみると、WEBrickはStopCallbackというコールバックを登録しておくことで、サーバ終了時に任意のコードを実行することができるようになっています。
ただ、rails-2.1.1のコードを見る限り、rails側からこのStopCallbackを登録する術が無いようで、結局うまい解決方法が見つからず、直接webrickのコードを修正してStopCallbackを登録できるようにしてみました。
1
2
3
4
5
6
7
8
9
10
11
|
@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あたりに、以下のようなコードを記述します。
1
2
3
4
5
6
7
|
# 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が呼ばれていることが確認できます。
1
2
3
4
5
6
7
8
9
10
|
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されるとどうにもなりませんが。
Sorry, comments are closed for this article.