通过HTTP的流控制台输出(使用Ruby)
我试图远程运行一些命令,SSH’ing到机器上不是一个选项。我想做的是安装一个Sinatra应用程序,它运行一些特定的命令并通过HTTP传输输出 示例操作如下所示:通过HTTP的流控制台输出(使用Ruby),ruby,sinatra,unicorn,Ruby,Sinatra,Unicorn,我试图远程运行一些命令,SSH’ing到机器上不是一个选项。我想做的是安装一个Sinatra应用程序,它运行一些特定的命令并通过HTTP传输输出 示例操作如下所示: get "/log" do `tail -f some.log` end 1据我所知,我需要使用Unicorn(或Mongrel),因为Thin不支持流式数据 2我想我需要通过某种IO ruby对象来传递命令输出 我几乎知道如何做(1),但不知道如何实现(2)。如果您使用的是同步服务器(即Mongrel、Unicorn、非Th
get "/log" do
`tail -f some.log`
end
1据我所知,我需要使用Unicorn(或Mongrel),因为Thin不支持流式数据
2我想我需要通过某种IO ruby对象来传递命令输出
我几乎知道如何做(1),但不知道如何实现(2)。如果您使用的是同步服务器(即Mongrel、Unicorn、非Thin),您只需返回一个IO对象:
require 'sinatra'
get '/log' do
content_type :txt
IO.popen('tail -f some.log')
end
如果这不起作用(例如,如果您使用的是精简版),您可以使用新的流式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
注意:对于无限运行的进程,如果有人关闭了连接,您必须自行终止该进程。对于第一个解决方案,一些服务器可能会为您解决这一问题。如果您使用最新版本的sinatra,第二个答案的可能副本可能值得一试。sinatra 1.3刚刚发布,支持流式处理,请查看您是否可以使用@user420504流式处理似乎正在工作,但在30秒时超时显示您可以终止该进程吗当使用第二种解决方案时?
require 'sinatra'
require 'bcat'
get '/log' do
command = %[tail -f some.log]
bcat = Bcat.new(command, :command => true)
bcat.to_app.call(env)
end