2016-08-30 251 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)似乎確實有所作爲。