ruby - 打开3并停止进程

标签 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

最佳答案

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,如果进程正在运行,则为runsleep,如果进程完成 (false) 或死亡 (nil),则为 falsenil:

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/

相关文章:

ruby-on-rails - 没有路由匹配 [GET] "demo/hello"

ruby-on-rails - 用 mocha stub 时替换方法实现

ruby-on-rails - 在将记录保存到 Rails 3 之前销毁记录

ruby-on-rails - Windows 版 Git 收到未知协议(protocol)错误

javascript - 从 rails 开始。对 SDK 插件等有建议吗?

ruby-on-rails - 提交帖子并获取和接收 ruby​​ 中的响应页面(外部网站)

Ruby - 如何在读取文件时跳过/忽略特定行?

ruby-on-rails - 强参数 - Devise 3.0.0 和 Rails 4。 "Unpermitted parameters: name"

ruby - 使用 Ruby 将文件从一个目录复制到另一个目录

c# - 使用正则表达式匹配两个特定单词之间的所有内容