Python杀死占用端口的进程(windows系统)

前言

因平时使用一些socket服务时,总是发现我要用的端口总是被占用,导致一些服务无法启动,而每次启动前人工去检索在杀死进程就很麻烦,于是就干脆封装一个函数直接整合进项目中彻底解放我的双手。

注意事项

该方式只支持在windows平台上使用,其他平台暂未测试,不清楚是否兼容

首先需要导入相关的模块

import os
import signal

安装对应模块的方式

# pip快速安装
pip install signal

首先找到占用端口的进程pid

import os

result = os.popen('netstat -aon|findstr "9001"')
print(result )

展示结果:
展示结果
返回的结果是一个文件对象,这个时候就需要读取它
有两种方式

# 方式1 该方式简单粗暴
print(result.read())

# 方式2 该方式更加优雅
with os.popen('netstat -aon|findstr "9001"') as fp:
    result = fp.read()
    print(result )

得到的结果如下图,为字符串:
执行结果
既然得到了结果,就可以着手解析,获取所需数据

import os

with os.popen('netstat -aon|findstr "9001"') as res:
    res = res.read().split('\n')
result = []
for line in res:
    temp = [i for i in line.split(' ') if i != '']
    if len(temp) > 4:
        print({'pid': temp[4], 'address': temp[1], 'state': temp[3]})

解析后的结果为:
解析结果
现在很方便操作了,因为我只需要部分数据,所以并没有取全部。
得到了进程pid,接下来是杀死进程。

直接调用OS的杀死进程命令:os.kill(进程pid, signal.SIGINT)
于是我们来改装下代码:

import os
import signal

# 判断端口是否被占用,占用直接把占用端口的进程给杀掉
with os.popen('netstat -aon|findstr "9001"') as res:
	res = res.read().split('\n')
	result = []
	for line in res:
		temp = [i for i in line.split(' ') if i != '']
		if len(temp) > 4:
			result.append(temp[4])
for i in result:
	os.kill(int(i), signal.SIGINT)
	print(f"杀死占用端口的进程成功,该进程pid:{i}")

执行结果为:
执行结果

### 如何在Windows系统中根据端口号找到并终止相关进程 #### 方法概述 在 Windows 操作系统中,可以通过 `netstat` 和 `taskkill` 命令来实现基于端口号查找并终止相关进程的功能。以下是具体的操作方法: 1. **使用 `netstat` 查找指定端口对应的 PID** 打开命令提示符(CMD),输入以下命令可以查看特定端口占用情况以及其关联的进程 ID (PID): ```bash netstat -ano | findstr :<端口号> ``` 例如,如果要查找占用 8080 端口进程,则运行如下命令[^1]: ```bash netstat -ano | findstr :8080 ``` 2. **获取目标进程的 PID 并确认信息** 上述命令会返回一列数据,其中最后一列表示该连接所属的进程编号(即 PID)。记录下这个 PID。 3. **使用 `taskkill` 终止对应进程** 输入以下命令即可强制结束指定 PID 的进程: ```bash taskkill /F /PID <PID号> ``` 如果已知 PID 是 1234,则可执行下列指令[^1][^2]: ```bash taskkill /F /PID 1234 ``` 需要注意的是,在某些情况下,由于权限限制可能导致无法成功杀死进程。此时应确保 CMD 是以管理员身份运行的状态。 4. **特殊情况处理——连同子进程一起清除** 当希望不仅停止父进程而且还要将其派生出来的所有子进程都销毁掉的时候,可以在上述基础上增加 `-t` 参数: ```bash taskkill /PID <PID> /T /F ``` #### 示例操作流程 假设当前有服务占用了 8888 端口,我们想要释放它以便重新部署新的应用实例。 - 步骤 A: 查询哪个程序正在监听此端口; ```bash netstat -ano|findstr 8888 ``` - 步骤 B: 得到的结果可能是这样的:“TCP 0.0.0.0:8888 ... LISTENING 9876”,这里显示 PID=9876; - 步骤 C: 杀死进程ID为9876的任务; ```bash taskkill /F /PID 9876 ``` 以上就是整个过程描述[^3]. #### 注意事项 - 运行这些命令前,请务必保存好重要工作成果以防意外丢失文件或未存档的数据。 - 对于生产环境中的服务器而言,随意中断活动的服务可能会带来不可预见的影响甚至业务损失,因此建议谨慎行事,并提前做好充分准备与沟通协调。 ```python # Python脚本自动化完成上述功能的小例子 import os port_number = input("请输入需要检测的端口号:") os.system(f"netstat -ano | findstr {port_number}") process_id = input("请依据上一步结果填写需关闭进程的PID:") confirmation = input(f"即将强行终止PID={process_id}的进程, 是否继续?(y/n): ") if confirmation.lower() == 'y': os.system(f"taskkill /F /PID {process_id}") else: print("操作取消.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦落影逝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值