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

mitm proxy已关闭但端口仍被占用,Python代码无法释放端口求助

解决mitm服务关闭后端口未释放的问题

1. 彻底终止mitmproxy关联进程

你当前的代码可能只停止了主服务,但mitmproxy启动的子进程仍在后台运行,导致端口被占用。可以通过进程树递归终止所有关联进程:

import psutil
import subprocess

# 启动mitmproxy时保存进程实例
mitm_process = subprocess.Popen(["mitmdump", "-s", "dumpMaster.py", "--listen-port", "8080"])

# 关闭服务时的清理函数
def stop_mitm_service(mitm_process):
    try:
        parent_proc = psutil.Process(mitm_process.pid)
        # 递归获取所有子进程
        child_procs = parent_proc.children(recursive=True)
        # 先杀子进程,再杀主进程
        for proc in child_procs:
            proc.kill()
        parent_proc.kill()
        # 等待进程退出,避免僵尸进程
        parent_proc.wait(timeout=5)
    except (psutil.NoSuchProcess, TimeoutError):
        # 进程已退出或超时,直接忽略
        pass

2. 在mitm脚本中添加连接清理逻辑

在dumpMaster类的done事件中,主动关闭所有未释放的socket连接:

from mitmproxy import ctx

class dumpMaster:
    def done(self):
        # 遍历并关闭所有活跃连接
        for conn in ctx.master.server.conns.values():
            conn.finish()
        # 触发mitmproxy的 shutdown 流程
        ctx.master.shutdown()

3. 强制释放Windows端口(应急方案)

如果上述方法无效,可以通过Python调用Windows系统命令,直接杀掉占用目标端口的进程(替换8080为你的实际端口):

import os

def force_release_port(port):
    # 查询占用端口的PID
    output = os.popen(f"netstat -ano | findstr :{port}").read().strip()
    if output:
        pid = output.split()[-1]
        # 强制终止进程
        os.system(f"taskkill /F /PID {pid}")

注意事项

  • Windows下避免用os.kill直接终止主进程,这种方式无法彻底清理mitmproxy的子进程
  • 检查代码中是否存在未关闭的长连接(如HTTP持久连接、第三方服务连接),这些也可能导致端口无法释放
  • mitmproxy 9.0.1版本存在少量进程清理不彻底的已知问题,若频繁出现该问题可考虑升级至稳定版

内容的提问来源于stack exchange,提问作者lingting

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:45:33