Ответ 1
Если вы находитесь на синхронном сервере (т.е. Mongrel, Unicorn, not Thin), вы можете просто вернуть объект IO:
require 'sinatra'
get '/log' do
content_type :txt
IO.popen('tail -f some.log')
end
Если это не работает (например, если вы используете Thin), вы можете использовать новый потоковый API:
require 'sinatra'
get '/log' do
content_type :txt
IO.popen('tail -f some.log') do |io|
stream do |out|
io.each { |s| out << s }
end
end
end
Вы также можете использовать bcat gem, который будет раскрашивать ваш вывод, если он содержит цветовые коды ANSI:
require 'sinatra'
require 'bcat'
get '/log' do
command = %[tail -f some.log]
bcat = Bcat.new(command, :command => true)
bcat.to_app.call(env)
end
Примечание. Для бесконечно бегущего процесса вам придется самому позаботиться об убийстве процесса, если кто-то закроет соединение. При первом решении некоторые серверы могут позаботиться об этом для вас.