fork的Ruby文件输出

时间:2012-03-30 19:16:14

标签: ruby process io filesystems

我有一个简单的脚本:

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 它只有在我修改脚本时才有效:

$stdout.puts "MESSAGE"
$stdout.flush

如何在不使用修改script.rb的情况下执行相同的? 感谢。

1 个答案:

答案 0 :(得分:1)

当您致电exec时,您会创建一个新流程,虽然此流程会继承您设置为标准输出的文件,但它不会继承其他设置,尤其是同步设置。

为了在新进程中获得无缓冲输出,您需要在该进程中设置它。如果您不想修改script.rb,则可以创建另一个文件,名为somethig,如sync.rb只包含:

STDOUT.sync = true
运行命令后可以使用的

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

新的Ruby进程现在需要sync.rb,它只需在执行脚本之前将STDOUT上的同步模式设置为true。