Если вы работаете на синхронном сервере (например, 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 , который раскрасит ваш вывод, еслион содержит цветовые коды 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
Примечание. Для бесконечно запущенного процесса вам придется позаботиться о том, чтобы убить процесс самостоятельно, если кто-то закроет соединение.С первым решением некоторые серверы могут позаботиться об этом за вас.