2012-09-24 8 views
5

Sto provando a biforcarsi un processo secondario, attendere che finisca, se non termina entro un certo periodo di tempo, ucciderlo.In attesa di pid figlio Ruby per uscire

Questo è quello che ho finora:

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 

Da qualche parte dopo/intorno Process.wait, vorrei una sorta di programma di utilità di attendere 20 secondi, e se il processo è ancora là fuori, I' Mi piacerebbe ucciderlo e segnare l'output come "ERRORE".

Sono nuovo alla forchetta/exec. Il mio codice in realtà funziona in biforcazione, ma non so come affrontare l'aspetto di attesa/uccisione di esso.

risposta

9

Utilizzare la Timeout module: (codice da 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

Questo ha funzionato PERFETTO! – awojo

0

danno la possibilità di subexec. Dal README:

Subexec è una semplice libreria che genera un comando esterno con un parametro di timeout opzionale. Fa affidamento sul metodo Process.spawn di Ruby 1.9. Inoltre, funziona con codice sincrono e asincrono.

Utile per le librerie che sono wrapper Ruby per CLI. Ad esempio, il ridimensionamento delle immagini con il comando mogrify di ImageMagick a volte si blocca e non restituisce mai il controllo al processo originale. Inserisci Subexec.

Problemi correlati