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)
注意:对于无限运行的进程,如果有人关闭连接,您必须自己处理该进程.使用第一个解决方案,一些服务器可能会为您处理.
| 归档时间: |
|
| 查看次数: |
3583 次 |
| 最近记录: |