Make Net:SSH更新更频繁地在exec块中返回数据包/块

时间:2014-12-13 09:22:12

标签: ruby net-ssh

我在远程服务器上有一个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内)

感谢您的帮助!

2 个答案:

答案 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或其他方式传递数据。