2013-03-25 7 views
5

У меня есть следующий код, в котором раздвоенный экземпляр WEBrick, и я хочу, чтобы ждать, пока WEBrick запускается, прежде чем продолжить с остальной частью кода:Вилка WEBrick и ждать начала

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 

Итак, как я могу дождаться завершения вилки, или даже лучше, пока WEBrick не будет готов к подключению? Я нашел фрагмент кода, где они имеют дело с IO.pipe и читателем и писателем. Но это не дожидается, когда webrick загрузится.

К сожалению, я ничего не нашел для этого конкретного случая. Надеюсь, кто-то может помочь.

ответ

6

WEBRick::GenericServer имеет несколько обратных вызовов крючки, которые не имеют документов (к сожалению, на самом деле, вся библиотека WEBrick плохо документированы!), такие как :StartCallback, :StopCallback, :AcceptCallback. Вы можете предоставить крючки при инициализации экземпляра WEBRick::HTTPServer.

Таким образом, в сочетании с IO.pipe, вы можете написать код так:

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

чудное! Я только заменил ваш rd.read (1); rd.close' с 'raise 'Сервер не запускается« если только rd.wait (10) », так что я могу указать тайм-аут и поднять ошибку. Спасибо за ответ! – 23tux