PowerShell根据端口查找进程

在日常开发启动后端服务时,经常会遇到类似EADDRINUSE: address already in use :::3000的问题。这类问题的本质是:
某个进程已经占用了目标端口,需要找到该进程并进行处理。
本文介绍如何使用PowerShell(pwsh)快速根据端口查找对应进程,并进一步查看、停止进程。
端口和进程
端口(Port)是操作系统用于区分网络连接的逻辑编号。

进程(Process)是正在运行的程序实例,每个进程都有唯一的PID(Process ID)。
使用Get-NetTCPConnection查找端口
PowerShell提供了Get-NetTCPConnection用于查询TCP连接状态。
查看指定端口:
|
|
输出:

关键字段:
| 字段 | 含义 |
|---|---|
| LocalPort | 本地端口 |
| State | 连接状态 |
| OwningProcess | 占用该端口的 PID |
这里OwningProcess = 24456表示PID为24456的进程占用了1313端口。
根据PID查看进程信息
拿到PID后:
|
|
输出:

说明hugo正在监听1313端口。
一条命令完成端口→进行查询
实际开发中,我们通常希望一步完成输入端口,直接显示占用进程。
比如查询1313:
|
|
查看所有监听端口
如果不知道哪个端口冲突,可以查看系统所有监听端口:
|
|

查看所有端口对应的进程
可以进一步组合:
|
|
输出:

使用netstat方式
也可使用Window传统工具netstat查看端口:
|
|
结果:

然后:
|
|
可查看到进程的详情。
根据端口直接结束进程
例如关闭占用1313端口的进程:
|
|
执行后,端口立即释放。
封装为PowerShell工具函数
为了使用方便,可以封装为一个函数:
|
|
将上述内容保存为PortProcess.psm1文件,将其放在$env:PSModulePath包含的路径里。

我选择的是C:\Users\Administrator\Documents\PowerShell\Modules。

接着,在PowerShell Profile中引入PortProcess:
|
|
这样每次启动PowerShell我们就可以直接用Get-PortProcess PORT啦!
有可能本机没有PowerShell Profile文件,可用Test-Path $PROFILE查验。如果返回的是False,使用New-Item -Path $PROFILE -ItemType File -Force新建即可。然后,用notepad $PROFILE用记事本打开该文件。
常用命令速查表
| 目的 | 命令 |
|---|---|
| 查询端口 | Get-NetTCPConnection -LocalPort PORT |
| 查询 PID 对应进程 | Get-Process -Id PID |
| 端口直接查进程 | Get-Process -Id (Get-NetTCPConnection -LocalPort PORT).OwningProcess |
| 查看所有监听端口 | Get-NetTCPConnection -State Listen |
| netstat 查询 | netstat -ano | findstr :PORT |
| 结束端口进程 | Stop-Process -Id PID -Force |
相关内容
支付宝
微信