SSH连接无法断开连接
我有一个长期运行的进程(有时> 2小时),打开一个SSH连接(ruby的Net::SSH
库),运行一个命令,然后closures连接。 这在我们的旧VM环境中运行良好。 我只是将代码移植到GKE中的Docker镜像,现在SSH连接被打开了。 这似乎只发生超过30分钟左右的工作。
我检查了两端,并在远程/服务器端(在/var/log/secure
)我可以看到连接build立,会话打开,然后会话closures。 用netstat -a
我可以看到连接不再列出。 但是在本地/客户端, netstat -a
显示的连接仍然是“ESTABLISHED”。 由于某种原因,它没有得到断开连接的通知。
鉴于这在一个环境,而不是另一个工作,我不认为这个问题是在Net::SSH
,而是在一些configuration是不同的或一些networking是不同的。
我已经尝试在客户端代码中添加一个保持活动状态(以为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( 按照这个SO回答 ),但似乎没有解决它:
TCPKeepAlive yes ClientAliveInterval 60 ClientAliveCountMax 3
那么,似乎设置服务器configuration,以保持客户端连接活着解决这一点。 所以把这个添加到服务器端:
TCPKeepAlive yes ClientAliveInterval 60 ClientAliveCountMax 3
我已经重新加载了sshd服务器( /etc/init.d/sshd reload
),但是这似乎没有办法。 重新启动服务器( /etc/init.d/ssh restart
)似乎有所作为。