2017-02-10 58 views
0

得到叉我有一個運行使用fork若干子進程的腳本:紅寶石由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 

我需要按下Ctrl + C停止腳本的能力。但時間緊迫,一些進程可能已經死了。因爲它可以驗證?

,如果你這樣做:

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

我得到一個錯誤:

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

回答

0

叉的結果是PID,所以而非fr.exited?您需要從過程中獲得具有fr的PID的過程狀態。不幸的是,Ruby沒有從PID獲取進程狀態的好方法。請參閱Get process status by pid in Ruby

如果嘗試殺死進程並且它已完成,則可以簡單地拯救該異常。而不是 :

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

這將是:

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