2012-09-24 10 views
5

Ich versuche, einen Teilprozess Gabel, warten auf es zu beenden, wenn es nicht innerhalb einer bestimmten Zeit fertig ist, töten Sie es.Warten auf Ruby Kind PID zum Beenden

Dies ist, was ich bisher:

servers.each do |server| 
    pid = fork do 
     puts "Forking #{server}." 
     output = "doing stuff here" 
     puts output 
    end 

    Process.wait 
    puts "#{server} child exited, pid = #{pid}" 
end 

Irgendwo nach/über Process.wait, ich irgendeine Art von Nutzen möchte 20 Sekunden warten, und wenn der Prozess immer noch da draußen, ich Ich möchte es töten und die Ausgabe als "FEHLER" markieren.

Ich bin neu zu fork/exec. Mein Code funktioniert tatsächlich Forking, aber ich weiß einfach nicht, wie man sich dem wartenden/tötenden Aspekt nähert.

Antwort

9

Verwenden Sie den Timeout module: (Code von http://www.whatastruggle.com/timeout-a-subprocess-in-ruby)

require 'timeout' 

servers.each do |server| 
    pid = fork do 
     puts "Forking #{server}." 
     output = "doing stuff here" 
     puts output 
    end 

    begin 
     Timeout.timeout(20) do 
      Process.wait 
     end 
    rescue Timeout::Error 
     Process.kill 9, pid 
     # collect status so it doesn't stick around as zombie process 
     Process.wait pid 
    end 
    puts "#{server} child exited, pid = #{pid}" 
end 
+0

Das funktionierte PERFEKT! – awojo

0

eine Chance geben subexec. Von der README:

SubExec ist eine einfache Bibliothek, die einen externen Befehl mit einem optionalen Timeout-Parameter hervorbringt. Es beruht auf der Process.spawn-Methode von Ruby 1.9. Außerdem funktioniert es mit synchronem und asynchronem Code.

Nützlich für Bibliotheken, die Ruby-Wrapper für CLIs sind. Beispielsweise wird die Größenänderung von Bildern mit dem Befehl "mogrify" von ImageMagick manchmal angehalten und gibt die Steuerung nie wieder an den ursprünglichen Prozess zurück. Geben Sie SubExec ein.

Verwandte Themen