我需要在使用Paramiko通过SSH执行长时间运行的命令时正确处理连接问题。
exec_command
有一个timeout
参数,但如果没有响应则抛出异常。因此,当连接丢失时以及执行的命令工作时间超过timeout
秒时,它会引发。
所以我尝试使用set_keepalive
,但这也不起作用。 Paramiko不保证发送keepalive数据包,似乎它不会检查来自服务器的keepalive响应。我只想说:
iptables -A INPUT -s ... -j DROP
在命令中间的目标服务器上执行并观察Paramiko的调试日志 - 它只是保持发送keepalive数据包,并且在没有服务器响应时不会注意。因此,似乎没有类似于openssh
ServerAliveCountMax
param的内容,如果没有来自ssh服务器的客户端响应,则会杀死ssh。
我认为没有办法区分长时间运行命令和网络故障。我可以在timeout
电话上加exec_command
并相信如果出现异常,它不是一个慢命令而是连接丢失。
有没有可靠的方法来解决这个问题?
答案 0 :(得分:0)
两种情况都是网络故障,一种情况是它从一开始就没有工作,另一种是因为它以后失败了。最后,它们之间没有太大区别。
由您来决定代码在这种情况下的行为方式。通常的方法是通过插入不断增长的超时来重试。
最着名的算法称为Exponential backoff。