在获取实时输出的同时,无法在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
task :print_and_wait do
puts 'A'
sleep 1
puts 'B'
sleep 1
putc 'C'
end
$ rake print_and_wait
输出3行(A,B和C),中间间隔一秒钟。符合预期
$ cat print_and_wait
#!/bin/bash
echo 'A'
sleep 1
echo 'B'
sleep 1
echo 'C'
$ 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'
$ ruby print_and_wait.rb
可以正常工作:输出3行,中间有1秒的停顿
exec_async './print_and_wait'
更改为exec_async 'rake print_and_wait'
$ ruby print_and_wait.rb
我尝试了几种组合,但从未能够按预期进行。知道为什么这不起作用吗?这是错误吗?
谢谢
答案 0 :(得分:1)
在rake任务的开头添加$stdout.sync = true
可以解决该问题。