Вывод грабли в реальном времени с помощью 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

Как воспроизвести

Подтверждение концепции: грабли

  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. Создать сценарий оболочки
$ 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 строки с паузой в одну секунду

Где не работает

  • отредактируйте скрипт 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 в начале грабли задача решена.

Другие вопросы по тегам