Вывод грабли в реальном времени с помощью popen3
Кажется невозможным запустить грабли изнутри 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'
- создать рубиновый скрипт
$ 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'
- бежать
$ ruby print_and_wait.rb
- ничего не выводится, и через 3 секунды все 3 строки печатаются одновременно
Я пробовал несколько комбинаций, но так и не смог заставить работать так, как ожидалось. Есть идеи, почему это не работает? Это ошибка?
Спасибо
1 ответ
Добавление $stdout.sync = true
в начале грабли задача решена.