SSH接続(ルビーのNet::SSH
ライブラリ)を開き、コマンドを実行してから接続を終了する、長時間実行するプロセス(時には> 2時間)があります。これは私たちの古いVM環境でうまくいきました。私はちょうどGKEのDockerイメージにコードを移植しました。そして今、SSH接続は開かれています。これは約30分以上実行されるジョブでのみ発生するようです。SSH接続の切断に失敗する
両端とリモート/サーバー側(/var/log/secure
)でチェックしたところ、接続が確立され、セッションが開かれてからセッションが閉じられたことがわかりました。 netstat -a
では、接続がもうリストされていないことがわかります。しかし、ローカル/クライアント側では、netstat -a
はまだ接続が「確立済み」であることを示しています。なんらかの理由で、切断の通知が得られません。
これはある環境ではなく、他に動作することを考えると、私はは問題がNet::SSH
ではなく、異なるいくつかの構成または異なるいくつかのネットワークであるとは思いません。
私はキープアライブをクライアント側のコードに追加しようとしましたが(キープアライブでは、サーバーが接続されていないときにクライアントが検出されると考えられていましたが)、違い:
Net::SSH.start(Settings.ssh.host, Settings.ssh.user, options) do |ssh|
ssh.send_global_request("[email protected]")
response = ssh.exec!(cmd)
end
は同様に、私はキープアライブ(per this SO answer)を含むように、サーバー上sshd
を更新し、それはそれを解決していないよう:
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3