python获取pid并杀死_荐python找到端口占用,并杀死进程,windows

当遇到端口被占用无法启动服务时,可以使用Python编写脚本来自动化查找并结束占用该端口的进程。通过os模块的popen方法结合cmd命令netstat和taskkill,或者使用win32api的TerminateProcess函数,实现进程的查找与结束。此外,还介绍了如何解析netstat命令的输出并提取所需信息。
摘要由CSDN通过智能技术生成

有时候我们发现电脑上某个端口被占用了,这就导致启动不了一些服务。

而每次手动去找到并杀死进程实在是麻烦,于是用python写个自动的来整活。

除了使用常见的os模块,本文还有提供使用win32api的例子

主要面向windows平台

首先,已知用cmd执行 netstat -aon | findstr "端口号" 可以找到占用端口的进程pid

在python中可以使用 os 模块的 popen 方法执行cmd命令,如这样:

import os

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

返回的结果是一个文件对象,就像我们用open函数打开文件一样,需要读取它:

print(result.read())

当然也可以使用上下文管理器with,效果一样,写法更优雅:

with os.popen('netstat -aon|findstr "443"') as r:

result = r.read()

得到的结果就如下图,是字符串:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI2MzczOTI1,size_16,color_FFFFFF,t_70

于是进行解析,方便操作:

import os

with os.popen('netstat -aon|findstr "443"') 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({'pid': temp[4], 'address': temp[1], 'state': temp[3]})

得到的结果成了这样:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI2MzczOTI1,size_16,color_FFFFFF,t_70

现在很方便操作了,因为我只需要部分数据,所以并没有取全部。

得到了进程pid,接下来是杀死进程。

还是可以通过执行cmd命令的方式来杀死进程,cmd命令:taskkill -pid 进程pid -f

依然可以用popen的方法去执行:

import os

result = os.popen("taskkill -pid 进程pid -f")

也可以使用win32api的TerminateProcess函数:

import win32api # 需要先pip install pywin32模块

handle = win32api.OpenProcess(1, False, "进程pid") # 获取进程句柄(pid类型为int!)

win32api.TerminateProcess(handle, 0) # 杀了它

win32api.CloseHandle(handle) # 关闭

这里说一下OpenProcess的第一个参数:

dwDesiredAccess,指的是进程访问权限

PROCESS_ALL_ACCESS //所有能获得的权限

PROCESS_CREATE_PROCESS //需要创建一个进程

PROCESS_CREATE_THREAD //需要创建一个线程

PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄

PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级

PROCESS_QUERY_LIMITED_INFORMATION /获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限/

PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级

PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize

PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限

PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess

PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)

PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory

PROCESS_VM_WRITE //读取进程内存空间的权限,可使用WriteProcessMemory

SYNCHRONIZE //等待进程终止

这里我们要结束进程,所以需要PROCESS_TERMINATE权限,也就是数字1

import win32con

win32con.PROCESS_TERMINATE # 也可以这样表示权限,更直观(返回结果是数字1)

同样,ctypes模块也可以做到上面这件事:

import ctypes

handle = ctypes.windll.kernel32.OpenProcess(1, False, "进程pid") # 同上(pid类型为int!)

ctypes.windll.kernel32.TerminateProcess(handle, -1)

ctypes.windll.kernel32.CloseHandle(handle)

哈哈,搞定了!

然后再说明一下TerminateProcess这个函数:

TerminateProcess(HANDLE hProcess,UINT uExitCode)

参数:

1、hProcess:要终止进程的句柄,需要先获取PROCESS_TERMINATE权限。

2、uExitCode:设置进程的退出值。可通过GetExitCodeProcess函数得到一个进程的退出值。

返回值:

如果失败将返回0,而成功将返回一个非零值。

本文结束~~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值