我有一个打开SSH连接(ruby的Net::SSH
库)的长时间运行的进程(有时> 2小时),运行一个命令,然后关闭连接。这在我们的旧VM环境中运行良好。我刚刚将代码移植到了GKE中的Docker镜像中,现在SSH连接被打开了。这似乎只发生超过30分钟左右的工作。SSH连接无法断开连接
我检查了两端,并在远程/服务器端(在/var/log/secure
)我可以看到建立的连接,会话打开,然后会话关闭。通过netstat -a
我可以看到连接不再列出。但在本地/客户端,netstat -a
显示连接仍“ESTABLISHED”。由于某种原因,它没有得到断开连接的通知。
鉴于这部作品在一个环境,而不是其他,我不认为的问题是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
同样,我在服务器上更新sshd
包括保活(per this SO answer),但是这似乎并没有已经解决它:
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 3