2014-12-13 41 views
1

我在遠程服務器上有一個ruby腳本,我通過Net:SSH在本地PC上運行。Make Net:SSH更新exec塊中返回的數據包/塊更經常

遠程腳本需要幾分鐘才能運行,並將其進度輸出到標準輸出。

我遇到的問題是我的exec命令中的塊只在數據包/塊已滿時才被調用。
因此,我每分鐘都能在一次打擊中取得進步。

下面是一些削減的例子是說明我的問題:

服務器腳本:

(0.999).each do |i| 
    puts i 
    sleep 1 
end 
puts 1000 

本地腳本:

Net::SSH.start('ip.v.4.addr', 'user', :keys => ['my_key']) do |ssh| 

    ssh.exec("ruby count_to_1000.rb") do |ch, stream, data| 
    puts data if stream == :stdout 
    end 

    ssh.loop(1) 

end 

是否有來自遠程任何方式腳本強制發送數據包/塊?
或者有沒有辦法在刷新之前設置一秒(或n位)的限制? (內網:SSH)

感謝您的幫助!

回答

1

嘗試flush

http://www.ruby-doc.org/core-2.1.5/IO.html#method-i-flush

(0.999).each do |i| 
    puts i 
    STDOUT.flush 
    sleep 1 
end 

或者sync

http://www.ruby-doc.org/core-2.1.5/IO.html#method-i-sync

STDOUT.sync = true 
(0.999).each do |i| 
    puts i 
    sleep 1 
end 

(未經測試,順便說一句也許他們需要在客戶端使用相反,或在一些其他IO流。但這些是立即想到的兩種方法。)

+0

'STDOUT.flush'使它像所有我想要的一樣工作,非常感謝!正如你先發布的那樣,包括一個工作示例和一個鏈接到文檔的綠色勾號是你的。再次感謝! – complistic 2014-12-13 14:24:31

1

在我的測試設置中,它按預期工作(使用localhost進行測試)。但是,STDOUT刷新可能存在一些問題。

你可以試着寫STDOUT使用puts(我聽說有一些區別,我真的不明白)代替。

因此,你可以在你的服務器使用:

(0.999).each do |i| 
    STDOUT.puts i 
    sleep 1 
end 
STDOUT.puts 1000 
#You could possibly also use "STDOUT.write 1000", but it will not append a newline, like puts does. 

如果不工作,那麼你可以嘗試使用STDOUT.flush()強制沖洗的STDOUT。我相信通過向STDOUT寫入一個空字符串可以實現相同的效果,但我不能確定。

也可能發生exec命令實際上等待整個過程終止由於某種原因(我無法從文檔中找出)。在這種情況下,你將無法實現你想要的。然後你可以考慮設置websocket,使用DRB或其他方式來傳遞數據。

+0

'puts'包含在'Kernel'中,所以調用'Kernel#puts'。基本上調用'$ stdout.puts',除非有一個'ARGV'。而'$ stdout'持有'STDOUT',除非它被代碼覆蓋。 – 2014-12-13 12:52:40