Поток вывода консоли через HTTP (с Ruby) - PullRequest
12 голосов
/ 07 октября 2011

Я пытаюсь запустить некоторые команды удаленно, и SSH'ing на машине не вариант. Я пытаюсь настроить приложение Sinatra, которое выполняет определенные команды и передает поток по HTTP.

Пример действия выглядит так:

get "/log" do
  `tail -f some.log`
end

1 Насколько я прочитал, мне нужно использовать Unicorn (или Mongrel), потому что Thin не поддерживает потоковую передачу данных. 2 Я думаю, что мне нужно pipe вывод команд через какой-то объект IO ruby ​​

Я почти знаю, как это сделать (1), но не знаю, как этого добиться (2).

1 Ответ

11 голосов
/ 08 октября 2011

Если вы работаете на синхронном сервере (например, 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

Примечание. Для бесконечно запущенного процесса вам придется позаботиться о том, чтобы убить процесс самостоятельно, если кто-то закроет соединение.С первым решением некоторые серверы могут позаботиться об этом за вас.

...