使用Psutil终止端口进程 | AI生成和翻译

Home 2025.04

使用 psutil 检测并终止指定端口的进程(Windows)

Psutil 是一个跨平台的 Python 库,用于获取运行进程信息和系统利用率。你可以用它来查找监听特定端口的进程(例如,识别类似 npm 开发服务器是否正在该端口运行),然后终止该进程。该方法在 Windows 上有效,但请注意:

第 1 步:安装 psutil

如果尚未安装:

pip install psutil

第 2 步:检测并终止的示例代码

这是一个完整的 Python 脚本。它定义了一个函数来查找监听给定端口的进程的 PID(使用你指定的 kind='inet'),然后终止它。在 Windows 上,terminate() 优于 kill(),因为它允许优雅关闭(相当于 Unix 上的 SIGTERM)。

import psutil
import time  # 用于可选的延迟

def get_pid_listening_on_port(port, kind='inet'):
    """
    扫描网络连接以查找监听指定端口的进程。
    返回一个 PID 列表(通常是一个,但在极少数情况下可能是多个)。
    """
    pids = []
    for conn in psutil.net_connections(kind=kind):
        # 检查是否为监听连接 (status='LISTEN') 且本地地址端口匹配
        if conn.status == 'LISTEN' and conn.laddr and conn.laddr.port == port:
            if conn.pid:
                pids.append(conn.pid)
    return pids

def kill_process_on_port(port, kind='inet'):
    """
    查找并终止监听指定端口的进程。
    如果存在多个进程,则全部终止(并发出警告)。
    """
    pids = get_pid_listening_on_port(port, kind)
    if not pids:
        print(f"在端口 {port} 上未找到监听进程。")
        return
    
    for pid in pids:
        try:
            proc = psutil.Process(pid)
            print(f"正在终止端口 {port} 上的进程 {proc.name()} (PID {pid})...")
            # 使用 terminate() 进行优雅关闭;它发送类似 SIGTERM 的信号
            proc.terminate()
            # 可选:等待一段时间,如果未退出则强制杀死
            gone, still_alive = psutil.wait_procs([proc], timeout=3)
            if still_alive:
                print(f"正在强制杀死 PID {pid}...")
                still_alive[0].kill()
        except psutil.AccessDenied:
            print(f"访问被拒绝:无法终止 PID {pid}。请以管理员身份运行?")
        except psutil.NoSuchProcess:
            print(f"进程 {pid} 已不存在。")

# 示例用法:将 3000 替换为目标端口(例如,npm 开发服务器通常使用 3000)
if __name__ == "__main__":
    kill_process_on_port(3000)  # 如果需要,调整 kind(例如,'inet4' 仅用于 IPv4)

关键说明

如果这不完全符合你的需求(例如,如果 “npm run port” 意味着其他内容,或者你想检测非监听连接),请提供更多细节以便改进!出于安全考虑,请确保你只杀死目标进程。


Back

x-ai/grok-code-fast-1

Donate