2013-03-25 37 views
5

Tôi có đoạn code sau đây, nơi một trường hợp WEBrick được chia hai, và tôi muốn chờ đợi cho đến khi webrick được khởi chạy, trước khi tiếp tục với phần còn lại của mã:Fork WEBrick và chờ đợi bắt đầu

require 'webrick' 

pid = fork do 
    server = WEBrick::HTTPServer.new({:Port => 3333, :BindAddress => "localhost"}) 
    trap("INT") { server.shutdown } 
    sleep 10 # here is code that take some time to setup 
    server.start 
end 
# here I want to wait till the fork is complete or the WEBrick server is started and accepts connections 
puts `curl localhost:3333 --max-time 1` # then I can talk to the webrick 
Process.kill('INT', pid) # finally the webrick should be killed 

Vì vậy, làm thế nào tôi có thể chờ đợi cho đến khi ngã ba là hoàn thành, hoặc thậm chí tốt hơn cho đến khi WEBrick đã sẵn sàng chấp nhận các kết nối? Tôi tìm thấy một đoạn mã nơi họ xử lý một số IO.pipe và một người đọc và một nhà văn. Nhưng điều đó không chờ đợi cho webrick tải.

Rất tiếc, tôi không tìm thấy bất kỳ điều gì cho trường hợp cụ thể này. Hy vọng ai đó có thể giúp đỡ.

Trả lời

6

WEBRick::GenericServer có một số móc callback mà không có giấy tờ (buồn bã, trên thực tế, thư viện toàn webrick được giấy tờ kém!), chẳng hạn như :StartCallback, :StopCallback, :AcceptCallback. Bạn có thể cung cấp các móc khi khởi tạo một cá thể WEBRick::HTTPServer.

Vì vậy, kết hợp với IO.pipe, bạn có thể viết mã của bạn như thế này:

require 'webrick' 

PORT = 3333 

rd, wt = IO.pipe 

pid = fork do 
    rd.close 
    server = WEBrick::HTTPServer.new({ 
    :Port => PORT, 
    :BindAddress => "localhost", 
    :StartCallback => Proc.new { 
     wt.write(1) # write "1", signal a server start message 
     wt.close 
    } 
    }) 
    trap("INT") { server.shutdown } 
    server.start 
end 

wt.close 
rd.read(1) # read a byte for the server start signal 
rd.close 

puts `curl localhost:#{PORT} --max-time 1` # then I can talk to the webrick 
Process.kill('INT', pid) # finally the webrick should be killed 
+0

tuyệt vời! Tôi chỉ thay thế 'rd.read (1) của bạn; rd.close' với 'nâng cao 'Máy chủ không bắt đầu" trừ khi rd.wait (10) 'để tôi có thể chỉ định một thời gian chờ và nâng cao một lỗi. Cảm ơn câu trả lời! – 23tux

Các vấn đề liên quan