Post请求脚本运行约10小时后停止的问题排查求助
问题诊断与解决方案
从你的测试场景和提供的信息来看,脚本运行一段时间后停止输出,主要有两个核心问题需要优先排查,还有一些额外的排查方向:
1. 未捕获的异常导致脚本崩溃
你的异常处理逻辑存在明显问题:
except requests.exceptions.ConnectionError: r.status_code = "Connection refused" print r.status_code
当触发ConnectionError时,r变量根本没有被创建(因为requests.post执行失败,没有完成赋值),这时候访问r.status_code会直接抛出NameError,而这个异常不在你的捕获范围内,会直接导致脚本终止运行,日志也就随之停止更新。
修复方式:修改异常处理部分,直接打印错误信息,避免引用未定义的变量:
except requests.exceptions.ConnectionError: print "Connection refused"
另外,除了ConnectionError,请求还可能遇到超时、DNS解析失败等其他异常,建议添加通用异常捕获,避免脚本意外终止:
try: r = requests.post(url=url, headers=headers, data=json.dumps(postData), verify=False, timeout=10) # 顺便加上超时参数 print r except requests.exceptions.ConnectionError: print "Connection refused" except Exception as e: print "Unexpected error: %s" % str(e) # Python 2 写法
2. 请求未设置超时,导致脚本无限阻塞
你的requests.post没有设置超时参数,当高可用切换过程中,服务器可能出现无响应的情况,此时请求会一直挂起,脚本停在requests.post这一步,进程状态显示为S(休眠,等待网络IO),自然不会继续输出日志和执行后续循环。
修复方式:给requests.post添加超时参数(根据业务场景调整时长,比如10秒):
r = requests.post(url=url, headers=headers, data=json.dumps(postData), verify=False, timeout=10)
这样如果请求在设定时间内没有得到响应,会抛出Timeout异常,被我们添加的通用异常捕获,脚本可以继续执行下一次循环。
其他排查方向
- 检查系统资源限制:用
ulimit -a查看当前进程的文件句柄数限制,如果脚本运行过程中打开了过多网络连接,可尝试调整限制。 - 查看系统日志:检查
/var/log/messages或syslog,确认是否有进程被OOM Killer杀掉的记录,或者网络相关的错误日志。 - 添加详细日志:在脚本中增加更多日志信息,比如当前循环的
num值、目标IP、请求时间,方便定位问题发生时的具体场景:
print "Processing num: {0}, IP: {1}, time: {2}".format(num, ip, time.strftime("%Y-%m-%d %H:%M:%S"))
按照上述方式修改脚本后,再测试看看是否还会出现停止输出的情况。
内容的提问来源于stack exchange,提问作者Xuesong Ye




