Windows根据TCP端口号查找进程PID再kill进程
Windows根据TCP端口号查找进程PID再kill进程
Windows环境下,有时候TCP端口莫名其妙的被占用,导致正常的网络端口绑定失败,比如Android开发中,adb无法识别,有时候原因就是端口被占用。Java开发中,端口在占用情况下若再次绑定则抛异常:
错误提示:
java.net.BindException: Address already in use: JVM_Bind
at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
此时可使用dos命令找到TCP端口号被那些进程占用,然后根据该进程的PID将其kill。
假设我起了一个程序占用本地端口9999,那么如何找到9999端口被什么进程占用,进而kill掉这个进程呢?
具体步骤如下:
(第一步)使用dos命令:
netstat -a -b -o
显示当前计算机所有端口被占用情况。其中,-a –b –o 参数的意义:
-a 显示所有连接和侦听端口。
-b 显示在创建每个连接或侦听端口时涉及的
可执行程序。在某些情况下,已知可执行程序承载
多个独立的组件,这些情况下,
显示创建连接或侦听端口时
涉及的组件序列。在此情况下,可执行程序的
名称位于底部 [] 中,它调用的组件位于顶部,
直至达到 TCP/IP。注意,此选项
可能很耗时,并且在你没有足够
权限时可能失败。
-o 显示拥有的与每个连接关联的进程 ID。
命令:
netstat -a -b -o
也可以合并为:
netstat -abo
结果相同。
(第二步)上一步输出的结果很多,如果有时间和精力,可以逐个用肉眼筛查,但是更智能化的方式是用命令筛查:
netstat -abo | findstr 9999
该命令中的findstr将根据提供的9999关键字查找包含该关键字的数据结果条目,筛选结果为:
最后面的13152即为占用9999端口的本地进程PID。
(第三步)经过第二步找到进程id :PID后,使用task kill命令即可kill该进程:
taskkill /F /PID 13152
至此,pid为13152的进程被kill,被占用的TCP端口9999得到释放。
在Android中,若是通过adb调试,adb提供一个命令杀掉自身占用的adb服务端口:
adb kill-server
反过来,启动adb则是:
adb start-server