使用Python脚本终止运行超15秒的Mongo查询异常问题
解决MongoDB长时查询终止脚本的问题
问题原因
你的currentOp命令调用方式错误,导致过滤条件{"secs_running": {"$gte": 15}}未生效,返回了所有运行中的操作(包括系统线程、短时长查询),而非仅符合条件的长时聚合查询。同时未做系统操作排除,容易误杀后台关键进程。
修正后的代码
def kill_long_running_queries(): # 用filter参数精准筛选目标查询 queries = client.admin.command( "currentOp", { "filter": { "secs_running": {"$gte": 15}, # 排除系统后台无操作线程 "op": {"$ne": "none"}, # 仅针对聚合查询,需其他查询可调整为"op": {"$in": ["query", "command"]} "command.aggregate": {"$exists": True}, # 排除MongoDB自动化代理等内部客户端操作 "appName": {"$ne": "MongoDB Automation Agent"} } } ) killed_count = 0 for query in queries.get('inprog', []): opid = query.get('opid') if opid: print(f"终止查询: {opid},运行时长: {query['secs_running']}秒") try: client.admin.command({"killOp": 1, "op": opid}) killed_count += 1 except Exception as e: print(f"终止查询{opid}失败: {str(e)}") print(f"成功终止查询数量: {killed_count}") return f"成功终止查询数量: {killed_count}"
关键调整说明
- 正确使用过滤参数:MongoDB的
currentOp命令需将筛选条件放在filter字段下,才能生效过滤。 - 排除非目标操作:通过
op字段排除系统后台线程,通过appName排除内部代理操作,避免误杀。 - 精准定位聚合查询:用
command.aggregate字段确保只针对聚合类长时查询,按需可扩展筛选范围。 - 异常容错:增加异常处理,避免因操作已结束或权限问题导致脚本中断。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

