我有一个长时间运行的进程(有时> 2小时)打开SSH连接(ruby' Net::SSH
库),运行命令,然后关闭连接。这在我们的旧VM环境中运行良好。我刚刚将代码移植到GKE中的Docker镜像,现在SSH连接被卡住了。这似乎只发生在运行时间超过30分钟的工作中。
我已经检查了两端,并且在远程/服务器端(/var/log/secure
)我可以看到已建立连接,会话已打开,然后会话已关闭。使用netstat -a
,我可以看到不再列出连接。但是在本地/客户端,netstat -a
显示连接仍然是" ESTABLISHED"。出于某种原因,它没有收到断开连接的通知。
鉴于这适用于一个环境,而不是另一个环境,我不会认为问题出现在Net::SSH
中,而是在某些不同的配置或某些网络中不同。
我尝试在客户端代码中添加keep-alive(认为keep-alive会触发客户端检测服务器何时不再连接),但这似乎使得没有区别:
Net::SSH.start(Settings.ssh.host, Settings.ssh.user, options) do |ssh|
ssh.send_global_request("keep-alive@openssh.com")
response = ssh.exec!(cmd)
end
同样,我更新了服务器上的sshd
以包含keep-alive(per this SO answer),但似乎并没有解决它:
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3
答案 0 :(得分:0)
好吧,似乎设置服务器配置以保持客户端连接活动解决了这个问题。所以将它添加到服务器端:
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3
我已经重新加载了sshd服务器(/etc/init.d/sshd reload
),但似乎没有做到这一点。重新启动服务器(/etc/init.d/ssh restart
)似乎确实有所不同。