簡體   English   中英

如何顯示通過get請求發生的popen輸出?

[英]How do I display the popen output as it happens through a get request?

我有一些Ruby腳本可用來自動執行一些rsync任務,這些任務可能需要很長時間才能完成。 我正在使用popen運行命令:

def process(command)
  io = IO.popen(command) 
  output = io.read
  io.close 
  return output 
end

該命令由Sinatra應用程序中的get請求執行:

get '/sync' do
  stream do |out|
    rsync_command = "rsync somedir" 
    out << process(rsync_command)
  end
end

然后,我在前端使用Ajax請求訪問輸出:

$.get('/sync', function (data) {
 console.log(data);
});

是否可以在發生過程中顯示shell輸出,而不是僅在過程結束時返回它?

IO :: popen:

將指定的命令作為子進程運行; 子進程的標准輸入和輸出將連接到返回的IO對象。

stdout是一個文件。 您要告訴ruby使用io.read行讀取整個文件,因此ruby必須等到到達文件末尾才能返回文本,這發生在另一端關閉管道時,即目標程序完成時執行。 您不必一次讀取整個文件 ,而可以逐行讀取文件:

def process(command)
  IO.popen(command) do |io|
    io.each do |line|
      puts line
    end
  end
end

這告訴ruby讀取文件,直到找到換行符,然后返回文本……反復獲取直到到達文件末尾。

這是一個完整的示例:

#my_prog.rb

text = ""

1.upto(10) do
  text << "."

  puts text
  STDOUT.flush

  sleep 1
end

...

def process(command)
  IO.popen(command) do |io|
    io.each do |line|
      puts line
    end
  end
end

my_command = 'ruby ./my_prog.rb'
process(my_command)

請注意,除非目標程序刷新了輸出,否則輸出將被緩沖 ,因此在緩沖區被填滿(此時將自動刷新緩沖區)或目標程序結束之前,將無法讀取文本。這時緩沖區也將自動刷新)。 不必重復調用STDOUT.flush() ,而只需在程序頂部使用STDOUT.sync = true行。 當sync設置為true時,ruby不會緩沖輸出。

IO.popen(command){ |f| puts f.lines.to_a }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM