2016-08-30 204 views
1

我有一个打开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 

回答

0

嗯,看来设置服务器配置保持客户端连接现场解决这个问题所以加入到这个服务器端:

TCPKeepAlive yes 
ClientAliveInterval 60 
ClientAliveCountMax 3 

我重装sshd服务器(/etc/init.d/sshd reload),但似乎并没有这样的伎俩。重新启动服务器(/etc/init.d/ssh restart)似乎确实有所作为。