Тайм-аут соединения? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть простой объект подключения

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 или как я могу повторно подключить объект подключения.

1 Ответ

0 голосов
/ 04 июля 2018

Так как при этом используется SFTP, то есть он проксируется по SSH, может быть возможно отправлять ping каждые X секунд, чтобы сохранить соединение открытым. Вы можете сделать это с помощью ServerAliveInterval в ~/.ssh/config или /etc/ssh/sshd_config, например:

Host *
  ServerAliveInterval 240

Также обратите внимание, что любые параметры, переданные в Net::SFTP.start, передаются в Net::SSH.start, поэтому вы можете использовать параметры , такие как verbose: :debug, для получения дополнительной информации о происходящем.

Другим вариантом было бы сделать что-то вроде списка файлов в некотором каталоге внутри цикла, который ожидает загрузки файла, чтобы сохранить соединение активным. Это также может быть возможно сделать в отдельном потоке, если SSH-соединения с одним и тем же хостом являются общими.

...