ruby 连接超时?

jslywgbw  于 2023-11-18  发布在  Ruby
关注(0)|答案(2)|浏览(149)

我有一个简单的连接对象

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是否是正确的错误代码,或者我如何重新连接对象。

sz81bmfz

sz81bmfz1#

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

Host *
  ServerAliveInterval 240

字符串
还要注意,传递给Net::SFTP.start的任何选项都会传递给Net::SSH.start,因此您可以使用options(如verbose: :debug)来获取有关正在发生的事情的更多信息。
另一种选择是在循环中的某个目录中列出文件,等待文件上传以保持连接活动。如果到同一主机的SSH连接是共享的,也可以在单独的线程中执行此操作。

s5a0g9ez

s5a0g9ez2#

ruby net/sftp有自己的连接keepalive参数

*keepalive:设置为+true+,当SSH服务器和Net::SSH客户端之间在keepalive_interval秒内没有流量时,向SSH服务器发送keepalive数据包。设置为+false+。
*keepalive_interval:keepalive. turn到+300+秒的间隔秒数。
*keepalive_maxcount:允许的最大keepalive包丢失数,最大值为3

示例代码

require 'net/ssh'
require 'net/sftp'
require 'net/sftp/constants'
require 'logger'

$SFTP_REMOTE_IP = '1.1.1.1'
$SFTP_REMOTE_USER = 'keepmealive'

sshlog = Logger.new(STDOUT)
sshlog.formatter = proc do |severity, datetime, progname, msg|
   "[RUBY SFTP-CLIENT] #{msg}\n"
end
sshlog.level = Logger::ERROR

sftp = Net::SFTP.start($SFTP_REMOTE_IP, $SFTP_REMOTE_USER, port: 22, timeout: 15, keepalive: true, keepalive_interval: 5, keepalive_maxcount: 2, logger: sshlog, verbose: 1)

# Wait to see keepalive
sleep 20

sftp.channel.eof! unless sftp.channel.nil? # Close SFTP channel
sftp.close_channel() unless sftp.nil? # Close SFTP

字符串

日志输出

[RUBY SFTP-CLIENT] sending lstat packet (10)
[RUBY SFTP-CLIENT] channel_data: 0 41b
[RUBY SFTP-CLIENT] sending keepalive 0
[RUBY SFTP-CLIENT] sending global request [email protected]

相关问题