我有一个简单的脚本:
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
的情况下执行相同的?
感谢。
答案 0 :(得分:1)
当您致电exec
时,您会创建一个新流程,虽然此流程会继承您设置为标准输出的文件,但它不会继承其他设置,尤其是同步设置。
为了在新进程中获得无缓冲输出,您需要在该进程中设置它。如果您不想修改script.rb
,则可以创建另一个文件,名为somethig,如sync.rb
只包含:
STDOUT.sync = true
运行命令后可以使用的:
exec 'bundle exec ruby -r./sync script.rb'
新的Ruby进程现在需要sync.rb
,它只需在执行脚本之前将STDOUT
上的同步模式设置为true。