Techioz Blog

接続がタイムアウトしますか?

概要

単純な接続オブジェクトがあります

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 が正しいかどうか、または接続オブジェクトを再接続する方法がわかりません。

解決策

これは SFTP を使用するため、つまり SSH 経由でプロキシされるため、接続を開いたままにするために X 秒ごとに「ping」を送信できる可能性があります。これは、~/.ssh/config または /etc/ssh/sshd_config の ServerAliveInterval を使用して実行できます。次に例を示します。

Host *
  ServerAliveInterval 240

また、Net::SFTP.start に渡されるオプションはすべて Net::SSH.start に渡されるため、verbose: :debug などのオプションを使用して、何が起こっているかに関する詳細情報を取得できることにも注意してください。

別のオプションは、接続をアクティブに保つためにファイルがアップロードされるのを待つループ内のディレクトリ内のファイルをリストするようなことを行うことです。同じホストへの SSH 接続が共有されている場合は、これを別のスレッドで実行できる場合もあります。