2017-02-10 59 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