Ruby файл выводится из fork - PullRequest
0 голосов
/ 30 марта 2012

У меня есть один простой скрипт:

fork do
  STDOUT.reopen(File.open('/tmp/log', 'w+'))
  STDOUT.sync = true
  exec 'bundle exec ruby script.rb'
end

script.rb:

loop do
    sleep 1
    puts "MESSAGE"
end

Когда это работает, все выходные данные буферизуются (?) И записывают в /tmp/log большими pice.
Работает только если я изменяю скрипт:

$stdout.puts "MESSAGE"
$stdout.flush

Как я могу сделать то же самое без изменения script.rb?
Спасибо.

1 Ответ

1 голос
/ 31 марта 2012

Когда вы вызываете exec, вы создаете новый процесс, и хотя этот процесс наследует файл, который вы установили как стандартный, он не наследует другие настройки, в частности настройку синхронизации.

Чтобы получить небуферизованный вывод в новом процессе, вам нужно установить его в этом процессе.Если вы не хотите изменять script.rb, одним из обходных путей может быть создание другого файла с именем somethig, например sync.rb, содержащего просто:

STDOUT.sync = true

, который затем может потребоваться при запуске вашей команды:

exec 'bundle exec ruby -r./sync script.rb'

Для нового процесса Ruby теперь потребуется sync.rb, который просто устанавливает режим синхронизации на STDOUT в true перед выполнением сценария.

...