0%

记录一次端口占用问题的解决过程

最近频繁遇到 IntelliJ IDEA 启动失败的问题,还有启动 TomCat 时 1099 端口占用问题,有时还有 ShadowSocksR 的 1080 端口占用问题。有时重启电脑能够解决问题,但并非总是有效。有时候 IDEA 用的好好的,但是电脑休眠后重新唤醒就打不开 IDEA 了。 TomCat 的 1099 端口占用问题也总是出现,使用 powershell 用以下命令查看端口占用情况,却找不到占用端口的进程。

1
netstat -aon | findstr 1099

查看了 IDEA 的启动日志,应该也是端口占用导致启动失败。Google 搜索到 JetBrains 官方支持社区的一个 帖子,了解到 IDEA 在启动时,会绑定 69426991 之间第一个可用的端口,如果无法绑定此范围内的任何端口,则会引发如下图所示异常:

有 Docker-for-Windows 的用户也遇到 无法绑定端口的问题,问题出现在 Hyper-V 上面,因为 Docker-for-Windows 需要启用 Hyper-V,而启用 Hyper-V 后,系统会保留一部分范围的端口,其他程序无法使用。如果程序使用了在此范围内的端口,会提示端口被占用,而且通过 netstat 命令也无法找到使用该端口的进程。

我电脑没开启 Hyper-V,但安装了 WSL2,而 WSL2 引入了真正的 Linux 内核,需要虚拟机平台支持。

下图是微软 WSL2 安装的教程截图,WSL2 需要虚拟机平台的支持,这里占用端口的应该就是虚拟机平台

通过以下命令可以查看被保留的端口范围:

1
netsh interface ipv4 show excludedportrange protocol=tcp

这个范围是动态的,重启之后可能就会变化。这就是 IDEA 有时能正常启动,有时就会报错的原因。同样 TomCat 和 ShadowSocksR 频繁遇到的端口占用问题,也是这个原因造成的。

下图中,69426991 端口都被保留了,所以此时 IDEA 启动失败

重启后,被保留端口的范围变了,69426991 不在范围内,IDEA 可以成功启动。但 1080 端口在被保留范围内,尝试开启 SSR,果然遇到了端口占用提示。

再次尝试重启,69426952 是可用的,IDEA 可以正常启动

1080 端口可用,SSR 设置端口成功:

找到了问题所在,解决方法也在上面提到的链接中,只需要把我们用到的端口排除在保留端口范围就可以了,用管理员身份启动 powershell,命令如下:

1
netsh int ipv4 add excludedportrange protocol=tcp startport = 起始端口 numberofports = 端口保留数量 

执行成功后,会输出确定:

再次查看保留端口范围,可以看到设置过的端口有 * 号标注,程序已经可以调用这些端口了。

如果执行命令后提示:“另一个程序正在使用此文件,进程无法访问”,可以尝试关闭 Hyper-V、虚拟机平台、WSL 功能,然后重启后再次尝试。

更新

今天又遇到了 v2rayN 的 10809 端口占用问题,用前面提到的命令会提示:另一个程序正在使用该文件,如果再关掉 Hyper-V、虚拟机啥的太麻烦了,而且以后遇到新的端口占用还得重复操作一遍。GitHub 上有人提到了 另一种方法,可以重置动态端口的范围:

1
netsh int ipv4 set dynamicport tcp start=49152 num=16383

执行之后重启电脑,再次查看保留端口范围,已经从 49152 开始了:

参考链接

https://github.com/docker/for-win/issues/3171

https://www.kairlec.com/?p=285

https://intellij-support.jetbrains.com/hc/en-us/community/posts/360004973960-Critical-Internal-Error-on-Startup-of-IntelliJ-IDEA-Cannot-Lock-System-Folders-

https://guochunyang.blog.csdn.net/article/details/104522895

https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-install