在获得实时输出时,似乎无法在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行,中间暂停一秒
exec_async './print_and_wait'
更改为exec_async 'rake print_and_wait'
$ ruby print_and_wait.rb
我尝试了几种组合,但从未能按预期工作。知道为什么这不起作用?这是一个错误吗?
谢谢
在rake任务开始时添加$stdout.sync = true
解决了它。