Кажется невозможным запустить грабли из блока popen3
, получая вывод в режиме реального времени.Все строки приходят сразу в конце задачи грабли.Я пытаюсь получить в режиме реального времени вывод из задач рейка через блок popen3
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) с паузой в одну секунду между ними.Как и ожидалось
Подтверждение концепции 2: popen3
- Создание сценария оболочки
$ cat print_and_wait
#!/bin/bash
echo 'A'
sleep 1
echo 'B'
sleep 1
echo 'C'
создать скрипт ruby
$ 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
$ ruby print_and_wait.rb
работает должным образом: вывести 3 строки с паузой в одну секунду
Где это не работает
- отредактируйте скрипт ruby print_and_wait.rb и измените
exec_async './print_and_wait'
на exec_async 'rake print_and_wait'
- run
$ ruby print_and_wait.rb
- ничего не выводится, и через 3 секунды все 3 строки выводятся нав то же время
Я пробовал несколько комбинаций, но так и не смог заставить его работать так, как ожидалось.Есть идеи, почему это не работает?Это ошибка?
Спасибо