通过HTTP流式控制台输出(使用Ruby)

时间:2011-10-07 08:33:15

标签: ruby sinatra unicorn

我正在尝试远程运行某些命令,并且不能选择SSH进入机器。我要做的是设置一个运行一些特定命令的Sinatra应用程序,并通过HTTP流输出输出。

示例操作如下所示:

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

1据我所知,我需要使用Unicorn(或Mongrel),因为Thin不支持流数据 2我认为我需要管道通过某种IO ruby​​对象输出的命令

我几乎知道怎么做(1)但不知道如何实现(2)。

1 个答案:

答案 0 :(得分:11)

如果您使用的是同步服务器(即Mongrel,Unicorn,精简),则只需返回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

如果它包含ANSI颜色代码,您还可以使用bcat gem,它将为您的输出着色:

require 'sinatra'
require 'bcat'

get '/log' do
  command = %[tail -f some.log]
  bcat = Bcat.new(command, :command => true)
  bcat.to_app.call(env)
end

注意:对于无限运行的进程,如果有人关闭连接,您必须自己处理该进程。有了第一个解决方案,一些服务器可能会为您处理这个问题。