You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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/messagessyslog,确认是否有进程被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

火山引擎 最新活动