[英]How do I target a element in an array made through an axios.get request?
[英]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.