Open3并停止进程

时间:2015-02-04 14:55:43

标签: ruby

检查使用Open3::popen3打开的流程是否已停止的正确方法是什么?我正在管理一个对进程有错误的大文件,需要尽快停止,最好每次循环迭代消耗最少的资源。程序基本上就是这样的

# launcher.rb
require 'open3'

Open3.popen3('ruby', 'consumer.rb') do |i, o, e, w|
  5.times do |n|
    i.puts(n)
    puts "line #{n}"
  end
  puts "Errors: #{e.read}"
end 

# consumer.rb
i = 0
ARGF.each_line do |line|
  if i == 2
    $stderr.write('error')
    exit(1)
  end
  i+=1
end

1 个答案:

答案 0 :(得分:3)

popen3返回一个数组,第四个元素是一个线程对象:

prc = Open3.popen3('sleep 10')
=> [#<IO:fd 10>, #<IO:fd 12>, #<IO:fd 14>, #<Thread:0x007f84b49c8480 sleep>]

正如您所见,线程本身显示状态,10秒后它将是:

=> [#<IO:fd 16>, #<IO:fd 18>, #<IO:fd 20>, #<Thread:0x007f84b437d120 dead>]

因此,要检查流程状态,您需要调查thread.status,如果流程正在运行,则runsleepfalse或{{1}如果过程完成(假)或死亡(无):

nil
几秒后

prc = Open3.popen3('sleep 10')
=> [#<IO:fd 10>, #<IO:fd 12>, #<IO:fd 14>, #<Thread:0x007f84b49c8480 sleep>]
prc[3].status
=> "sleep"