Вывод грабли в реальном времени с помощью popen3 - PullRequest
0 голосов
/ 20 февраля 2019

Кажется невозможным запустить грабли из блока 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
вызов задачи из командной строки

$ 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'
создать скрипт 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 строки выводятся нав то же время

Я пробовал несколько комбинаций, но так и не смог заставить его работать так, как ожидалось.Есть идеи, почему это не работает?Это ошибка?

Спасибо

1 Ответ

0 голосов
/ 20 февраля 2019

Добавление $stdout.sync = true в начале рейка решило задачу.

...