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

Kos*_*tas 12 ruby sinatra unicorn

我试图远程运行一些命令,SSH不能进入机器.我想要做的是设置一个运行一些特定命令的Sinatra应用程序,并通过HTTP流输出输出.

示例操作如下所示:

get "/log" do
  `tail -f some.log`
end
Run Code Online (Sandbox Code Playgroud)

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

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

Kon*_*ase 12

如果您在同步服务器上(即Mongrel,Unicorn,而不是 Thin),您只需返回一个IO对象:

require 'sinatra'

get '/log' do
  content_type :txt
  IO.popen('tail -f some.log')
end
Run Code Online (Sandbox Code Playgroud)

如果这不起作用(例如,如果您使用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
Run Code Online (Sandbox Code Playgroud)

如果它包含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
Run Code Online (Sandbox Code Playgroud)

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