2017-02-10 6 views
0

habe ich ein Skript, das Verfahren mit der Gabel mehr Kind läuft:Rubin erhält Gabel von pid

def my_fork s 
    puts "start fork #{s}, pid #{Process.pid}" 
    sleep s 
    puts "finish" 
end 

forks = [] 
5.times do |t| 
    forks << fork do 
    my_fork t+5 
    end 
end 

begin 
    Process.waitall 
rescue Interrupt => e 
    puts "interrupted!" 
    forks.each{|fr| Process.kill 9, fr} 
end 

Ich brauche die Möglichkeit, das Skript zu stoppen durch Drücken von Strg + C. Aber wenn Zeit drängt, können einige Prozesse schon tot sein. wie es verifiziert werden kann?

wenn Sie dies tun:

forks.each{|fr| puts fr.exited?; Process.kill 9, fr} 

Ich erhalte eine Fehlermeldung:

undefined method `exited?' for 27520:Fixnum (NoMethodError) 

Antwort

0

Das Ergebnis der Gabel ist die PID, also eher als fr.exited? Sie müssten den Prozessstatus aus dem Prozess mit einer PID von fr abrufen. Leider hat Ruby keine gute Möglichkeit, den Prozessstatus von einer PID zu erhalten. Siehe Get process status by pid in Ruby

Sie können die Ausnahme einfach retten, wenn Sie versuchen, den Prozess zu beenden, und es ist bereits abgeschlossen. statt:

forks.each{|fr| Process.kill 9, fr} 

es wäre:

forks.each do |fr| 
    begin 
    Process.kill 9, fr 
    rescue Errno::ESRCH 
    puts "process #{fr} already exited" 
    end 
end