使用popen3

时间:2019-02-20 10:15:39

标签: ruby rake rake-task popen3

在获取实时输出的同时,无法在popen3块内运行rake任务。所有行在rake任务结束时立即出现。我正在尝试通过popen3块从rake任务获取实时输出

cmd = 'rake perform_a_task'
Open3::popen3(cmd) do |std_in, std_out, std_err|
  std_out.each_line do |line|
    puts line
  end
end

如何复制

概念证明:耙任务

  1. 创建任务如下
task :print_and_wait do
  puts 'A'
  sleep 1
  puts 'B'
  sleep 1
  putc 'C'
end
  1. 从命令行调用任务

$ rake print_and_wait输出3行(A,B和C),中间间隔一秒钟。符合预期

概念证明2:popen3

  1. 创建shell脚本
$ cat print_and_wait
#!/bin/bash
echo 'A'
sleep 1
echo 'B'
sleep 1
echo 'C'
  1. 创建红宝石单据
$ cat print_and_wait.rb
require 'open3'

def exec_async(cmd)
  Open3::popen3(cmd) do |std_in, std_out, std_err|
    std_out.each_line do |line|
      puts line
    end
  end
end

exec_async './print_and_wait'
  1. 运行ruby脚本

$ ruby print_and_wait.rb可以正常工作:输出3行,中间有1秒的停顿

在不起作用的地方

  • 编辑ruby脚本print_and_wait.rb并将exec_async './print_and_wait'更改为exec_async 'rake print_and_wait'
  • 运行$ ruby print_and_wait.rb
  • 什么也没有输出,三秒钟后,所有三行同时打印

我尝试了几种组合,但从未能够按预期进行。知道为什么这不起作用吗?这是错误吗?

谢谢

1 个答案:

答案 0 :(得分:1)

在rake任务的开头添加$stdout.sync = true可以解决该问题。