如何找出哪个进程正在侦听 Windows 上的 TCP 或 UDP 端口?
34 回答
新答案,powershell
TCP
Get-Process -Id (Get-NetTCPConnection -LocalPort YourPortNumberHere).OwningProcess
UDP
Get-Process -Id (Get-NetUDPEndpoint -LocalPort YourPortNumberHere).OwningProcess
旧答案,cmd
C:\> netstat -a -b
(添加-n以阻止它尝试解析主机名,这将使其更快。)
请注意 Dane 对TCPView的建议。它看起来非常有用!
-a 显示所有连接和监听端口。
-b 显示创建每个连接或侦听端口所涉及的可执行文件。在某些情况下,众所周知的可执行文件包含多个独立组件,在这些情况下,会显示创建连接或侦听端口所涉及的组件序列。在这种情况下,可执行文件名称在底部的 [] 中,顶部是它调用的组件,依此类推,直到到达 TCP/IP。请注意,此选项可能会很耗时并且会失败,除非您有足够的权限。
-n 以数字形式显示地址和端口号。
-o 显示与每个连接关联的拥有进程 ID。
Windows 有一个原生 GUI:
开始菜单 →所有程序→附件→系统工具→资源监视器
或运行
resmon.exe
,或从任务管理器→性能选项卡。
对于 Windows:
netstat -aon | find /i "listening"
如果您想要一个 GUI,请使用TCPView 。这是微软收购的旧Sysinternals应用程序。
如果您运行以下命令,您可以获得更多信息:
netstat -aon | find /i "listening" |find "port"
使用“查找”命令可以过滤结果。find /i "listening"
将仅显示“正在侦听”的端口。请注意,您需要/i
忽略大小写,否则您将键入 find "LISTENING"。| find "port"
会将结果限制为仅包含特定端口号的结果。请注意,在此它还将过滤在响应字符串中任何位置具有端口号的结果。
打开命令提示符窗口(以管理员身份) 从“开始\搜索框”输入“cmd”,然后右键单击“cmd.exe”并选择“以管理员身份运行”
输入以下文本,然后按 Enter。
netstat -abno
-a 显示所有连接和监听端口。
-b 显示创建每个连接或侦听端口所涉及的可执行文件。在某些情况下,众所周知的可执行文件包含多个独立组件,在这些情况下,会显示创建连接或侦听端口所涉及的组件序列。在这种情况下,可执行文件名称在底部的 [] 中,顶部是它调用的组件,依此类推,直到到达 TCP/IP。请注意,此选项可能会很耗时并且会失败,除非您有足够的权限。
-n 以数字形式显示地址和端口号。
-o 显示与每个连接关联的拥有进程 ID。
在“本地地址”下找到您正在监听的端口
查看直接在其下方的进程名称。
注意:在任务管理器下查找进程
请注意您正在查看的端口旁边的 PID(进程标识符)。
打开 Windows 任务管理器。
选择进程选项卡。
查找在步骤 1 中执行 netstat 时记下的 PID。
如果您没有看到 PID 列,请单击查看/选择列。选择 PID。
确保选中“显示所有用户的进程”。
获取 PID 和图像名称
只使用一个命令:
for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /FI "PID eq %a"
where9000
应该替换为您的端口号。
输出将包含如下内容:
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
java.exe 5312 Services 0 130,768 K
解释:
它遍历以下命令输出的每一行:
netstat -aon | findstr 9000
从每一行中,
%a
提取 PID( - 这里的名称并不重要)(PID 是该行中的5
第 th 个元素)并传递给以下命令tasklist /FI "PID eq 5312"
如果要跳过标题和命令提示符的返回,可以使用:
echo off & (for /f "tokens=5" %a in ('netstat -aon ^| findstr 9000') do tasklist /NH /FI "PID eq %a") & echo on
输出:
java.exe 5312 Services 0 130,768 K
首先,我们找到我们需要消除的特定任务的进程 ID,以便释放端口:
类型
netstat -n -a -o
在 Windows 命令行提示符 (cmd) 中执行此命令后,选择我认为最后一列的 pid。假设这是 3312。
现在输入
taskkill /F /PID 3312
您现在可以通过键入netstat
命令进行交叉检查。
注意:有时 Windows 不允许您直接在 CMD 上运行此命令,因此首先您需要执行以下步骤:
从开始菜单 -> 命令提示符(右键单击命令提示符,并以管理员身份运行)
要获取与每个连接关联的所有拥有进程 ID 的列表:
netstat -ao |find /i "listening"
如果要杀死任何具有该 ID 的进程并使用此命令,则该端口变为空闲
Taskkill /F /IM PID of a process
在 Windows 中从 PID 获取端口号非常简单。
以下是步骤:
去运行→输入cmd→按Enter。
编写以下命令...
netstat -aon | findstr [port number]
(注意:不要包括方括号。)
按Enter...
然后 cmd 将为您提供在该端口上运行的服务的详细信息以及 PID。
打开任务管理器并点击服务选项卡并将PID与cmd的PID匹配,就是这样。
在 Windows 10 或 Windows Server 2016 上使用 PowerShell 5,运行Get-NetTCPConnection
cmdlet。我想它也应该适用于较旧的 Windows 版本。
由于某种原因,默认输出Get-NetTCPConnection
不包括进程 ID,这有点令人困惑。但是,您始终可以通过格式化输出来获得它。您正在寻找的物业是OwningProcess
。
如果要找出正在侦听端口 443 的进程的 ID,请运行以下命令:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-List LocalAddress : :: LocalPort : 443 RemoteAddress : :: RemotePort : 0 State : Listen AppliedSetting : OwningProcess : 4572 CreationTime : 02.11.2016 21:55:43 OffloadState : InHost
将输出格式化为具有您要查找的属性的表:
PS C:\> Get-NetTCPConnection -LocalPort 443 | Format-Table -Property LocalAddress, LocalPort, State, OwningProcess LocalAddress LocalPort State OwningProcess ------------ --------- ----- ------------- :: 443 Listen 4572 0.0.0.0 443 Listen 4572
如果要找出进程的名称,请运行以下命令:
PS C:\> Get-Process -Id (Get-NetTCPConnection -LocalPort 443).OwningProcess Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 143 15 3448 11024 4572 0 VisualSVNServer
要找出哪个特定进程 (PID) 正在使用哪个端口:
netstat -anon | findstr 1234
其中 1234 是您的进程的 PID。[转到任务管理器 → 服务/进程选项卡以找出您的应用程序的 PID。]
netstat -aof | findstr :8080
(为任何端口更改 8080)
只需打开一个命令外壳并输入(假设您的端口是 123456):
netstat -a -n -o | find "123456"
你会看到你需要的一切。
标题是:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:37 0.0.0.0:0 LISTENING 1111
这是这里提到的。
如果您想使用 GUI 工具来执行此操作,可以使用Sysinternals 的 TCPView。
打开命令提示符——开始→运行→
cmd
,或开始菜单→所有程序→附件→命令提示符。类型
netstat -aon | findstr '[port_number]'
将 替换为[port_number]
您要检查并点击的实际端口号Enter。
- 如果任何应用程序正在使用该端口,则将显示该应用程序的详细信息。显示在列表最后一列的数字是该应用程序的 PID(进程 ID)。记下这一点。
类型
tasklist | findstr '[PID]'
将 替换为[PID]
上述步骤中的数字并点击Enter。
- 您将看到使用您的端口号的应用程序名称。
如果有人像我一样需要 macOS 的等价物,这里是:
lsof -i tcp:8080
获得PID
进程后,您可以使用以下命令将其杀死:
kill -9 <PID>
网络统计:
- -a 显示所有连接和监听端口
- -b 显示可执行文件
- -n 停止解析主机名(数字形式)
-o 拥有进程
netstat -bano | findstr "7002" netstat -ano > ano.txt
Currports工具有助于搜索和过滤
输入命令:netstat -aon | findstr :DESIRED_PORT_NUMBER
例如,如果我想查找端口 80:netstat -aon | findstr :80
这个答案最初是针对这个问题发布的。
netstat -ao
并netstat -ab
告诉你应用程序,但如果你不是系统管理员,你会得到“请求的操作需要提升”。
这并不理想,但是如果您使用 Sysinternals 的Process Explorer,您可以转到特定进程的属性并查看 TCP 选项卡以查看它们是否正在使用您感兴趣的端口。这有点像大海捞针事情,但也许它会帮助某人......
一个对我有帮助的单行解决方案就是这个。只需将 3000 替换为您的端口:
$P = Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess; Stop-Process $P.Id
编辑:更改kill
为Stop-Process
更多类似 PowerShell 的语言
遵循这些工具: 从cmd:C:\> netstat -anob
具有管理员权限。
全部来自 sysinternals.com。
如果你只是想知道进程运行和每个进程下的线程,我建议学习wmic
. 它是一个很棒的命令行工具,它为您提供了比您知道的更多的东西。
例子:
c:\> wmic process list brief /every:5
上述命令将每 5 秒简要显示一次所有进程列表。要了解更多信息,您可以使用/?
windows 命令,例如,
c:\> wmic /?
c:\> wmic process /?
c:\> wmic prcess list /?
等等等等。:)
使用 Windows 的默认 shell (powershell) 并且不使用外部应用程序
对于那些使用 PowerShell 的人,请尝试Get-NetworkStatistics
:
> Get-NetworkStatistics | where Localport -eq 8000
ComputerName : DESKTOP-JL59SC6
Protocol : TCP
LocalAddress : 0.0.0.0
LocalPort : 8000
RemoteAddress : 0.0.0.0
RemotePort : 0
State : LISTENING
ProcessName : node
PID : 11552
采用:
netstat -a -o
这显示了在特定端口上运行的进程的 PID。
记住进程 ID 并转到任务管理器和服务或详细信息选项卡并结束具有相同 PID 的进程。
因此,您可以终止在 Windows 中特定端口上运行的进程。
查找使用8000端口的pid
netstat -aon | findstr '8000'
在 Windows 中终止该进程
taskkill /pid pid /f
其中 pid 是您从第一个命令中获得的进程 ID
使用 PowerShell ... ...这将是您的朋友(将 8080 替换为您的端口号):
netstat -abno | Select-String -Context 0,1 -Pattern 8080
样本输出
> TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 2920
[tnslsnr.exe]
> TCP [::]:8080 [::]:0 LISTENING 2920
[tnslsnr.exe]
所以在这个例子中 tnslsnr.exe(OracleXE 数据库)正在监听端口 8080。
快速解释
Select-String
用于过滤netstat
相关行的冗长输出。-Pattern
根据正则表达式测试每一行。-Context 0,1
将为每个模式匹配输出 0 个前导行和 1 个尾随行。
以编程方式,您需要iphlpapi.h中的内容,例如GetTcpTable2 ()。MIB_TCP6ROW2之类的结构包含所有者 PID。
您还可以使用以下命令检查保留端口。例如,Hyper-V 保留了一些端口。
netsh int ipv4 show excludedportrange protocol=tcp
对于 Windows,如果要查找正在侦听或连接到端口 1234 的内容,请在 cmd 提示符下执行以下命令:
netstat -na | find "1234"
使用下面的批处理脚本,它将进程名称作为参数并为netstat
进程提供输出。
@echo off
set procName=%1
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq %1" /fo csv') do call :Foo %%~F
goto End
:Foo
set z=%1
echo netstat for : "%procName%" which had pid "%1"
echo ----------------------------------------------------------------------
netstat -ano |findstr %z%
goto :eof
:End
根据info和kill的答案,对我来说将它们组合在一个命令中很有用。您可以从 cmd 运行它以获取有关侦听给定端口(例如 8080)的进程的信息:
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @tasklist /nh /fi "pid eq %i"
或者如果你想杀死它:
for /f "tokens=3 delims=LISTENING" %i in ('netstat -ano ^| findStr "8080" ^| findStr "["') do @Taskkill /F /IM %i
您还可以将这些命令放入 bat 文件中(它们会略有不同 - 替换%i
为%%i
):
文件portInfo.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @tasklist /nh /fi "pid eq %%i"
文件portKill.bat
for /f "tokens=3 delims=LISTENING" %%i in (
'netstat -ano ^| findStr "%1" ^| findStr "["'
) do @Taskkill /F /IM %%i
然后你从 cmd 你可以这样做:
portInfo.bat 8080
或者
portKill.bat 8080
电源外壳
如果你想有一个很好的概述,你可以使用这个:
Get-NetTCPConnection -State Listen | Select-Object -Property *, `
@{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} `
| select ProcessName,LocalAddress,LocalPort
比你得到一张这样的桌子:
ProcessName LocalAddress LocalPort
----------- ------------ ---------
services :: 49755
jhi_service ::1 49673
svchost :: 135
services 0.0.0.0 49755
spoolsv 0.0.0.0 49672
对于 udp,它是:
Get-NetUDPEndpoint | Select-Object -Property *, `
@{'Name' = 'ProcessName';'Expression'={(Get-Process -Id $_.OwningProcess).Name}} `
| select ProcessName,LocalAddress,LocalPort