第26章:网络超时与重试策略——SSH 连接超时和重试机制
网络运维脚本最怕什么?卡死。一台设备响应慢,整个脚本停在那里不动,后面的设备全等着。这种体验,值班人员会直接关掉脚本。 这章讲两个东西:超时控制和重试机制。这是让脚本稳定跑起来的关键。
一、SSH 连接超时
ssh.connect() 有一个 timeout 参数,单位是秒:

不加 timeout 参数,连接会一直等。网络不通时,Python 默认会等很久很久。加了 timeout=5,5秒没响应就抛异常,程序继续往下走。 这是 20230711.py 版本的代码,没有超时参数:

这是 20260401.py 版本的代码,加了超时:

二、超时异常要捕获
加了超时参数,如果真超时了,会抛出 socket.timeout 异常。这个异常不在 except Exception 里面,所以要单独处理,或者用 except 捕获所有异常:

except Exception as e 能捕获大部分错误,包括:超时、认证失败、连接被拒绝、主机不可达。把错误信息记录到 txtserror 列表里,后面统一处理。
三、外部程序调用也要重试
SSH 连接有超时,外部程序调用也要重试。比如打开记事本显示告警内容:

记事本打开文件也用了同样的重试逻辑:

四、重试次数不是越多越好
重试次数设多少?5次比较合适。 次数太少,可能偶然失败一次就放弃了。次数太多,万一程序真的有问题,会反复尝试浪费时间。5次是一个平衡点,给足机会但不会无限卡着。 另外,每次重试之间要不要等?我的代码里 sleep(0.5),等半秒再试。有些场景可能需要等更久,比如设备刚重启,短时间内不会响应。
五、超时时间和重试次数的关系
超时时间控制的是单次尝试的上限,重试次数控制的是最多尝试几次。两者配合使用:

六、失败日志要保留
连接失败了,要记录下来。不能静悄悄的什么都不管。txtserror 列表专门存失败信息:

这些日志对于排查网络问题很有用。哪天发现某台设备总是连不上,看看日志就知道是超时了还是认证失败了。
七、跳过长连接设备
旧版本脚本连接失败后会跳过计算:

新版本也保留了同样的逻辑。如果有设备连不上,说明这轮数据不完整,不做比对,避免误报:

超时和重试是让脚本稳定跑起来的基本功。加了这两样东西,脚本不会因为一台设备的问题卡住,也不会因为偶然的网络抖动就报错退出。
关注公众号,输入「专线检测管理平台」获取打包好的 EXE 程序。作者:沉迷 | 微信公众号:沉迷2017
作者:沉迷 | 微信公众号:沉迷2017