我希望运行多个系统命令,并获得以下内容:
不幸的是,以下代码最终会出现:
/usr/lib/ruby/1.9.1/open3.rb:276:in
read': closed stream (IOError) from /usr/lib/ruby/1.9.1/open3.rb:276:in
阻止(2级) capture3'
偶尔会依赖于线程调度。 例如,当将超时更改为2秒(或完全删除超时块)时,代码可以正常工作。
以下是示例代码:
require 'open3'
require 'timeout'
def output_from(command)
o, e, s = Open3.capture3(command)
return o
end
attempts = 0
Thread.abort_on_exception = true
for i in 0..5
Thread.new {
begin
Timeout::timeout(0.0001) {
output = output_from('cat /proc/cpuinfo')
}
rescue Timeout::Error => e
attempts+=1
retry unless attempts > 2
end
}
end
puts attempts
我曾在rescue
方法尝试output_from
并关闭o,但也没有帮助。
我觉得线程以某种方式共享管道或popen3实现中的一些变量。