我在远程服务器上有一个ruby脚本,我通过Net运行:本地PC上的SSH。
远程脚本需要几分钟才能运行并将其输出到stdout。
我遇到的问题是我的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位)的限制? (在Net:SSH内)
感谢您的帮助!
答案 0 :(得分: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流上使用。但这些是立即想到的两种方法。)
答案 1 :(得分: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
强制刷新STDOUT.flush()
。我相信通过向STDOUT写一个空字符串可以实现同样的目的,但我不是1000%肯定。
可能还会发生exec
命令实际上因某种原因等待整个进程终止(我无法从文档中找出)。在这种情况下,您将无法实现您想要的效果。然后,您可以考虑设置websockets,使用DRB或其他方式传递数据。