我正在尝试远程运行某些命令,并且不能选择SSH进入机器。我要做的是设置一个运行一些特定命令的Sinatra应用程序,并通过HTTP流输出输出。
示例操作如下所示:
get "/log" do
`tail -f some.log`
end
1据我所知,我需要使用Unicorn(或Mongrel),因为Thin不支持流数据 2我认为我需要管道通过某种IO ruby对象输出的命令
我几乎知道怎么做(1)但不知道如何实现(2)。
答案 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
注意:对于无限运行的进程,如果有人关闭连接,您必须自己处理该进程。有了第一个解决方案,一些服务器可能会为您处理这个问题。