我有一个简单的连接对象
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是否是正确的错误代码,或者我如何重新连接对象。
2条答案
按热度按时间sz81bmfz1#
由于这使用了SFTP,即通过SSH进行代理,因此可以每隔X秒发送一次“ping”来保持连接打开。您可以在
~/.ssh/config
或/etc/ssh/sshd_config
中使用ServerAliveInterval
来执行此操作,例如:字符串
还要注意,传递给
Net::SFTP.start
的任何选项都会传递给Net::SSH.start
,因此您可以使用options(如verbose: :debug
)来获取有关正在发生的事情的更多信息。另一种选择是在循环中的某个目录中列出文件,等待文件上传以保持连接活动。如果到同一主机的SSH连接是共享的,也可以在单独的线程中执行此操作。
s5a0g9ez2#
ruby net/sftp有自己的连接keepalive参数
*keepalive:设置为+true+,当SSH服务器和Net::SSH客户端之间在keepalive_interval秒内没有流量时,向SSH服务器发送keepalive数据包。设置为+false+。
*keepalive_interval:keepalive. turn到+300+秒的间隔秒数。
*keepalive_maxcount:允许的最大keepalive包丢失数,最大值为3
示例代码
字符串
日志输出
型