Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过HTTP的流控制台输出(使用Ruby)_Ruby_Sinatra_Unicorn - Fatal编程技术网

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

通过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

我试图远程运行一些命令,SSH’ing到机器上不是一个选项。我想做的是安装一个Sinatra应用程序,它运行一些特定的命令并通过HTTP传输输出

示例操作如下所示:

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