2013-03-25 17 views
5

Mam następujący kod, gdzie instancja WEBrick jest rozdwojony i chcę czekać aż WEBrick jest uruchomiony, przed kontynuowaniem reszty kodu:Widelec WEBrick i czekać na początku

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 

Więc jak mogę poczekać, aż widelec będzie gotowy, albo jeszcze lepiej, aż WEBrick będzie gotowy do akceptacji połączeń? Znalazłem kawałek kodu, gdzie zajmują się IO.pipe oraz czytnikiem i pisarzem. Ale to nie czeka na załadowanie się Webrick.

Niestety, nie znalazłem nic dla tego konkretnego przypadku. Mam nadzieję, że ktoś może pomóc.

Odpowiedz

6

WEBRick::GenericServer ma jakieś haki zwrotnych, które są nieudokumentowane (niestety, w rzeczywistości, cała biblioteka WEBrick jest słabo udokumentowana!), takie jak :StartCallback, :StopCallback, :AcceptCallback. Możesz podać haczyki podczas inicjowania instancji WEBRick::HTTPServer.

Więc, w połączeniu z IO.pipe, można napisać kod tak:

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

wspaniałe! Zastąpiłem tylko twoje 'rd.read (1); rd.close' with 'raise" Serwer nie został uruchomiony ", chyba że rd.wait (10)', abym mógł określić limit czasu i zgłosić błąd. Dziękuję za odpowiedź! – 23tux