Parallel-SSH - как закрыть канал ssh через определенное время?

Итак, вполне возможно, что ответом на этот вопрос будет просто "прекратить использование Parallels-SSH и написать свой собственный код, используя netmiko/paramiko. Кроме того, уже обновитесь до Python 3".

Но вот моя проблема: я использую Parallels-SSH, чтобы попытаться подключить до 80 устройств одновременно. Эти устройства общеизвестно ненадежны, и они иногда зависают после выдачи одной или двух строк вывода. Затем код параллельного ssh зависает в течение нескольких часов, оставляя скрипт работающим, пока я его не убью. Я запрыгнул на виртуальную машину, выполняющую сценарии после выходных, и увидел работу, которая застряла на 52 часа.

Соответствующие части моего первого кода, который висит:

from pssh.pssh2_client import ParallelSSHClient
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return result

Следующее, что я попробовал, был параметр channel_timout, потому что, если для получения выходных данных команды требуется более 4 минут, я знаю, что устройство зависло, и мне нужно перейти и запустить его позже в сценарии:

from pssh.pssh_client import ParallelSSHClient
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, channel_timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return result

Эта версия никогда не соединяется ни с чем. Любой совет? Я не смог найти ничего, кроме channel_timeout, чтобы попытаться завершить сеанс SSH через определенное время.

1 ответ

Код создает клиентский объект внутри функции, а затем возвращает только вывод run_command который включает в себя удаленные каналы к серверу SSH.

Так как client объект никогда не возвращается функцией, он выходит из области видимости и получает мусор, собираемый Python, который закрывает соединение.

Попытка использовать удаленные каналы при закрытом соединении никогда не сработает. Если вы фиксируете трассировку стека застрявшего скрипта, он, скорее всего, зависает при использовании удаленного канала или соединения.

Измените свой код, чтобы клиент оставался в живых. Клиент в идеале также должен быть повторно использован.

from pssh.pssh2_client import ParallelSSHClient

def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return client, result

Убедитесь, что вы понимаете, где код работает неправильно, прежде чем делать выводы, которые не решат проблему, то есть захватить трассировку стека того, где он висит. Тот же код, делающий то же самое, сломается так же

Другие вопросы по тегам