当开发或运行网络服务时,端口占用是一个常见问题。它可能阻止你启动服务器、调试应用或运行软件。幸运的是,有一个简单的Python脚本可以帮助你自动检测和结束占用特定端口的进程。
重要提示: 在执行任何终止进程的操作之前,请确保了解该进程的用途。不当地结束重要进程可能会导致数据丢失或系统不稳定。
首先,确保你的系统中安装了psutil
库,它是一个跨平台库,用于访问系统利用情况和相关的进程信息。如果尚未安装,可以通过pip安装它:
pip install psutil
以下是脚本的核心部分:
- find_procs_by_port: 这个函数会查找并返回所有占用指定端口的进程。
- 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}.")
在使用此脚本之前,请确保你理解它的功能,并且已经备份了重要数据。此脚本在帮助你管理端口和进程时应该非常有用,但应该谨慎使用。