2016-08-30 5 views
1

У меня есть длительный процесс (иногда> 2 часа), который открывает соединение SSH (библиотека ruby's Net::SSH), запускает команду, а затем закрывает соединение. Это отлично работало в нашей старой среде VM. Я только что портировал код на изображения Docker в GKE, и теперь соединения SSH закрываются. Это, похоже, происходит только для рабочих мест, которые работают более 30 минут.Соединение SSH не удается отключить

Я проверил на обоих концах и на удаленном/серверном конце (в /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("[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) действительно изменила ситуацию.

Смежные вопросы