Python Paramiko-ssh服务器在命令执行期间死亡->;悬挂

Python Paramiko-ssh服务器在命令执行期间死亡->;悬挂,python,ssh,timeout,paramiko,python-2.x,Python,Ssh,Timeout,Paramiko,Python 2.x,我正在使用paramiko用python 2.7编写一个小型自动化软件。有可能在执行过程中远程机器(ssh服务器)死亡,我的paramiko客户端无法识别它,并挂起recv_exit_status()方法。如果我为通道或传输设置了超时,则它不会执行任何操作。transport.set_keepalive()也没有帮助 channel = transport.open_session() channel.exec_command(cmd) exit_code = channel.recv_exit

我正在使用paramiko用python 2.7编写一个小型自动化软件。有可能在执行过程中远程机器(ssh服务器)死亡,我的paramiko客户端无法识别它,并挂起recv_exit_status()方法。如果我为通道或传输设置了超时,则它不会执行任何操作。transport.set_keepalive()也没有帮助

channel = transport.open_session()
channel.exec_command(cmd)
exit_code = channel.recv_exit_status()
我认为另一种方法也可能很好:

transport.set_keepalive(1)
channel = transport.open_session()
channel.exec_command(cmd)
while not channel.exit_status_ready():
    time.sleep(1)
    print "waiting", str(transport.is_active())
exit_code = channel.recv_exit_status()

但是is_active()返回的总是True,它永远不会变为False,即使在半分钟之后。。。我的软件是重线程的,因此如果发生这种情况,线程将永远挂在阻塞方法recv_exit_status()上,并成为僵尸,我不能允许(主要是从专业角度来看)。另外,我知道主动轮询通常是一种糟糕的编程技术,但我还是尝试了。。。感谢各位的帮助

您是否尝试设置连接超时?连接超时仅定义连接方法在连接失败之前应等待多长时间(应尝试多长时间)。我有这一套,不过主要是因为很多其他原因。我已经连接好了,我已经发出了命令,可能ssh服务器在完成前面提到的命令之前就死了……对不起,我是说其他类型的,实际上,我还没有尝试过。我当然会这样做。但是,当有长时间的操作正在进行且服务器根本不应该响应时,我不能允许连接断开,例如mysqldump到文件中等。这些操作甚至可能需要几分钟,并且连接不能断开,当机器没有响应时,我需要断开连接。我会将问题转移到上游。我会在远程端放置一个简单的脚本来管理您的命令。然后我会通过Paramiko使用“nohup”调用脚本——将脚本放在后台——然后我会立即断开连接。此外,您可以对脚本进行编程,以便它可以将过程结果“netcat”到另一台服务器或将其写入日志。因此,我将重新连接以检查日志或执行下一步操作。通过这种方式,如果SSH冻结了您的连接,您的进程不会死掉。