当开发或运行网络服务时,端口占用是一个常见问题。它可能阻止你启动服务器、调试应用或运行软件。幸运的是,有一个简单的Python脚本可以帮助你自动检测和结束占用特定端口的进程。

重要提示: 在执行任何终止进程的操作之前,请确保了解该进程的用途。不当地结束重要进程可能会导致数据丢失或系统不稳定。

首先,确保你的系统中安装了psutil库,它是一个跨平台库,用于访问系统利用情况和相关的进程信息。如果尚未安装,可以通过pip安装它:

pip install psutil

以下是脚本的核心部分:

  1. find_procs_by_port: 这个函数会查找并返回所有占用指定端口的进程。
  2. kill_proc_tree: 这个函数会安全地结束指定PID的进程及其所有子进程。
import psutil
import os

# 要检查的端口
PORT = 9999

def find_procs_by_port(port):
    """返回占用指定端口的所有进程列表"""
    procs = []
    for proc in psutil.process_iter(['pid', 'name']):
        try:
            for conns in proc.connections(kind='inet'):
                if conns.laddr.port == port:
                    procs.append(proc)
        except psutil.Error:  # 忽略无法访问的进程
            pass
    return procs

def kill_proc_tree(pid, including_parent=True):
    """结束指定PID的进程及其子进程"""
    parent = psutil.Process(pid)
    children = parent.children(recursive=True)
    for child in children:
        child.kill()
    if including_parent:
        parent.kill()

# 查找并结束占用端口的进程
procs = find_procs_by_port(PORT)
if procs:
    for proc in procs:
        print(f"Found process {proc.pid} occupying port {PORT}. Attempting to kill.")
        try:
            kill_proc_tree(proc.pid)
        except psutil.NoSuchProcess:
            pass
else:
    print(f"No process found occupying port {PORT}.")

在使用此脚本之前,请确保你理解它的功能,并且已经备份了重要数据。此脚本在帮助你管理端口和进程时应该非常有用,但应该谨慎使用。