You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:05:37