检查使用 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
最佳答案
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
,如果进程正在运行,则为run
或sleep
,如果进程完成 (false) 或死亡 (nil),则为 false
或 nil
:
prc = Open3.popen3('sleep 10')
=> [#<IO:fd 10>, #<IO:fd 12>, #<IO:fd 14>, #<Thread:0x007f84b49c8480 sleep>]
prc[3].status
=> "sleep"
几秒钟后:
prc[3].status
=> false
关于ruby - 打开3并停止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28324375/