解决 Windows 端口被占用的问题
在启动 Go 服务时,遇到一个报错:
1 | net.Listen address ":80" failed: listen tcp :80: bind: An attempt was made to access a socket in a way forbidden by its access permissions. |
一看就是 80 端口被占用了,有可能是 IIS、Apache或你重未听说过的应用,如 SQL Server Reporting Services,那如何找到占用端口的应用呢?
打开 Windows 命令行工具,CMD、PowerShell 或 PowerShell ISE(我习惯用 ISE,因为它编辑文本一样编辑命令,我 macOS 用的多,Windows 很多快捷键我也不会去记)。
输入命令
netstat -ano | findstr ":80 PID"
查找端口被占用的 PID。1
2
3
4
5
6
7PS C:\Users\Administrator> netstat -ano | findstr ":80 PID"
协议 本地地址 外部地址 状态 PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 4
TCP 10.46.16.30:62353 120.238.118.141:8081 ESTABLISHED 3380
TCP [::]:80 [::]:0 LISTENING 4
TCP [::]:8080 [::]:0 LISTENING 4使用
tasklist
命令查找到 PID 为 4 的进程。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52PS C:\Users\Administrator> tasklist /?
TASKLIST [/S system [/U username [/P [password]]]]
[/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
描述:
该工具显示在本地或远程机器上当前运行的进程列表。
参数列表:
...
/V 显示详细任务信息。
/FI filter 显示一系列符合筛选器
/? Displays this help message.
筛选器:
筛选器名称 有效运算符 有效值
----------- --------------- --------------------------
STATUS eq, ne RUNNING | SUSPENDED
NOT RESPONDING | UNKNOWN
IMAGENAME eq, ne 映像名称
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 会话编号
SESSIONNAME eq, ne 会话名称
CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
hh:mm:ss。
hh - 小时,
mm - 分钟,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 内存使用(以 KB 为单位)
USERNAME eq, ne 用户名,格式为
[域\]用户
SERVICES eq, ne 服务名称
WINDOWTITLE eq, ne 窗口标题
MODULES eq, ne DLL name
注意: 当查询远程计算机时,不支持 "WINDOWTITLE" 和 "STATUS"
筛选器。
Examples:
TASKLIST
...
TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"
PS C:\Users\Administrator> tasklist /v /fi "pid eq 4"
映像名称 PID 会话名 会话# 内存使用 状态 用户名 CPU 时间 窗口标题
========================= ======== ================ =========== ============ =============== ================================================== ============ ====
====================================================================
System 4 Services 0 312 K Unknown 暂缺 0:52:22 暂缺进程名称为 System,那一般就是微软自己的软件产品,可能是这些服务:
SQL Server Reporting Services (MSSQLSERVER),它是 SQL Server 的报表服务。如果你不使用报表的话可以将其停掉,不会影响数据库的其他工作。
报表的应用属于 BI 中的基础应用,即标准报表。BI的应用分两种,一种是标准报表报表,一种是分析应用。
要关闭它,需要到服务中将该服务设置启动类型为禁用(禁用是为了防止开机启动),并且将它停止。
IIS 服务器,IIS 启用后,默认网站就占用了 80 端口。
通过以上方法应该就能解决端口占用的问题了。
解决 Windows 端口被占用的问题