0

我有简单的连接对象

require 'net/sftp'
@con = Net::SFTP.start(@@host, @@username, :password => @@password
...
@con.upload!(filepath, destination)

我在一个脚本中有这个,它监听被放入文件夹的文件。文件被收集,并上传到远程 sfpt 服务器。一切正常,但似乎在脚本运行足够长的时间后,它会中断并抛出此错误:

exception while processing events: Write to the server failed

我只能假设发生这种情况是因为空闲连接在一定时间后断开。是否可以无限期地保持连接打开?或者这是一个限制?

如果那不可能,我可以管理错误吗?就像是:

begin
    @con.upload!(filepath, destination)
rescue Net::SFTPStatusException => e
    if e.code == 7 //connection lost code
        @con.{reconnect}//Whatever this would look like
    end
    else
        raise
    end
end

不确定 7 是否是正确的错误代码,或者我如何重新连接连接对象。

4

1 回答 1

1

由于它使用 SFTP,即它通过 SSH 代理,因此可以每 X 秒发送一次“ping”以保持连接打开。您可以使用ServerAliveIntervalin~/.ssh/config或来执行此操作/etc/ssh/sshd_config,例如:

Host *
  ServerAliveInterval 240

另请注意,传递给的任何选项都会传递Net::SFTP.start给 ,Net::SSH.start因此您可以使用诸如获取有关正在发生的事情的更多信息之类的选项。verbose: :debug

另一种选择是在循环中的某个目录中执行诸如列表文件之类的操作,该循环等待文件上传以保持连接处于活动状态。如果共享到同一主机的 SSH 连接,也可以在单独的线程中执行此操作。

于 2018-07-04T18:16:07.750 回答