1 简介
在使用spring-boot程序开发时,经常会使用8080端口,一种常见的情形时,明明自己并没有启用程序,但Intellij IDEA却提示端口正在被监听
我们怎样解决上述的问题,即杀掉占用该端口的进程。一种常用的方式即通过命令行模式下,使用netstat命令查询端口使用情况如下所示
2 问题描述
运行程序之后,Intellij IDEA提示如下;
java.net.BindException: Address already in use: bind
The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured.
如何确定占用8080端口的程序呢?
2.1 netstat
C:\Users\Administrator>netstat /?
显示协议统计和当前 TCP/IP 网络连接。
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval]
-a 显示所有连接和侦听端口。
-b 显示在创建每个连接或侦听端口时涉及的可执行程序。
在某些情况下,已知可执行程序承载多个独立的
组件,这些情况下,显示创建连接或侦听端口时涉
及的组件序列。此情况下,可执行程序的名称
位于底部[]中,它调用的组件位于顶部,直至达
到 TCP/IP。注意,此选项可能很耗时,并且在您没有
足够权限时可能失败。
-e 显示以太网统计。此选项可以与 -s 选项结合使用。
-f 显示外部地址的完全限定域名(FQDN)。
-n 以数字形式显示地址和端口号。
-o 显示拥有的与每个连接关联的进程 ID。
-p proto 显示 proto 指定的协议的连接;proto 可以是下列任
何一个: TCP、UDP、TCPv6 或 UDPv6。如果与 -s 选
项一起用来显示每个协议的统计,proto 可以是下列任
何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP
或 UDPv6。
-r 显示路由表。
-s 显示每个协议的统计。默认情况下,显示
IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6
的统计;-p 选项可用于指定默认的子网。
-t 显示当前连接卸载状态。
interval 重新显示选定的统计,各个显示间暂停的间隔秒数。
按 CTRL+C 停止重新显示统计。如果省略,则 netstat
将打印当前的配置信息一次。
C:\Users\Administrator>
因此,我们可以通过netstat命令查看被占用的端口的进程ID号和相关的IP地址,IP协议。
因为会显示所有进程,因此需要过滤手段,可以使用如下的措施:
2.2 过滤命令
2.2.1 可以使用tasklist自带的filter选项
C:\Users\Administrator>tasklist /?
TASKLIST [/S system [/U username [/P [password]]]]
[/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
描述:
该工具显示在本地或远程机器上当前运行的进程列表。
参数列表:
/S system 指定连接到的远程系统。
/U [domain\]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果省略,则
提示输入。
/M [module] 列出当前使用所给 exe/dll 名称的所有任务。
如果没有指定模块名称,显示所有加载的模块。
/SVC 显示每个进程中主持的服务。
/V 显示详述任务信息。
/FI filter 显示一系列符合筛选器指定的标准的任务。
/FO format 指定输出格式。
有效值: "TABLE"、"LIST"、"CSV"。
/NH 指定列标题不应该在输出中显示。
只对 "TABLE" 和 "CSV" 格式有效。
/? 显示帮助消息。
筛选器:
筛选器名 有效操作符 有效值
----------- --------------- --------------------------
STATUS eq, ne RUNNING |
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 用户名,格式为 [domain\]user
SERVICES eq, ne 服务名称
WINDOWTITLE eq, ne 窗口标题
MODULES eq, ne DLL 名称
说明: 当查询远程机器时,不支持 "WINDOWTITLE" 和 "STATUS"
筛选器。
示例:
TASKLIST
TASKLIST /M
TASKLIST /V /FO CSV
TASKLIST /SVC /FO LIST
TASKLIST /M wbem*
TASKLIST /S system /FO LIST
TASKLIST /S system /U domain\username /FO CSV /NH
TASKLIST /S system /U username /P password /FO TABLE /NH
TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"
[注意:使用/FI选项时要使用字符串]
C:\Users\Administrator>
2.2.1.1 示例
C:\Users\Administrator>tasklist /FI "PID eq 2848"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
Listary.exe 2848 Console 1 65,000 K
2.2.2 使用findstr命令
C:\Users\Administrator>findstr /?
在文件中寻找字符串。
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
strings [[drive:][path]filename[ ...]]
/B 在一行的开始配对模式。
/E 在一行的结尾配对模式。
/L 按字使用搜索字符串。
/R 将搜索字符串作为一般表达式使用。
/S 在当前目录和所有子目录中搜索匹配文件。
/I 指定搜索不分大小写。
/X 打印完全匹配的行。
/V 只打印不包含匹配的行。
/N 在匹配的每行前打印行数。
/M 如果文件含有匹配项,只打印其文件名。
/O 在每个匹配行前打印字符偏移量。
/P 忽略有不可打印字符的文件。
/OFF[LINE] 不跳过带有脱机属性集的文件。
/A:attr 指定有十六进位数字的颜色属性。请见 "color /?"
/F:file 从指定文件读文件列表 (/ 代表控制台)。
/C:string 使用指定字符串作为文字搜索字符串。
/G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。
/D:dir 查找以分号为分隔符的目录列表
strings 要查找的文字。
[drive:][path]filename
指定要查找的文件。
除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there"。'FINDSTR /C:"hello there" x.y' 文件 x.y 寻找
"hello there"。
一般表达式的快速参考:
. 通配符: 任何字符
* 重复: 以前字符或类出现零或零以上次数
^ 行位置: 行的开始
$ 行位置: 行的终点
[class] 字符类: 任何在字符集中的字符
[^class] 补字符类: 任何不在字符集中的字符
[x-y] 范围: 在指定范围内的任何字符
\x Escape: 元字符 x 的文字用法
\<xyz 字位置: 字的开始
xyz\> 字位置: 字的结束
有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。
C:\Users\Administrator>
2.2.2.1 示例
C:\Users\Administrator>tasklist | findstr 2848
Listary.exe 2848 Console 1 65,000 K
上述两个示例均为通过进程号获取进程名的演示
3 解决步骤
查找端口占用程序的步骤如下:
3.1 netstat查找端口占用程序的进程ID
netstat –ano | findstr 80
C:\Users\Administrator>netstat -ano | findstr 80
TCP 127.0.0.1:49180 127.0.0.1:49181 ESTABLISHED 3272
TCP 127.0.0.1:49181 127.0.0.1:49180 ESTABLISHED 3272
最后即为PID
3.2 tasklist找到进程名
tasklist |findstr PID
C:\Users\Administrator>tasklist | findstr 3272
firefox.exe 3272 Console 1 454,208 K
firefox.exe即为进程名,可以通过进程名杀死进程
3.3 taskkill终止进程
C:\Users\Administrator>taskkill /t /f /im firefox.exe
成功: 已终止 PID 3876 (属于 PID 3392 子进程)的进程。
成功: 已终止 PID 3960 (属于 PID 3392 子进程)的进程。
成功: 已终止 PID 3272 (属于 PID 3392 子进程)的进程。
成功: 已终止 PID 3920 (属于 PID 3392 子进程)的进程。
成功: 已终止 PID 3692 (属于 PID 3392 子进程)的进程。
成功: 已终止 PID 4476 (属于 PID 3392 子进程)的进程。
成功: 已终止 PID 3828 (属于 PID 3392 子进程)的进程。
成功: 已终止 PID 3392 (属于 PID 1512 子进程)的进程。