一、问题场景
在Windows
上运维服务过程中,经常会遇到运行服务,部署安装时候无任何问题,后续再某个特殊时间点,突然服务无法启动了。再次启动时,提示端口占用与以一种访问权限不允许的方式做了一个访问套接字的尝试
。
出现这种问题,常见有两种可能:
1)端口已被其他进程占用
服务启动时,需要绑定监听的TCP/UDP
对应端口,已经被其他进程以同种TCP/UDP
协议占用(一个端口不能被多个独立进程以同种协议占用)。
2)Winnat
服务不让用
端口并未被其他进程以同种TCP/UDP
协议占用,只是当前端口被winnat
服务作为排除端口,添加到了TCP/UDP
协议列表范围内(服务不让这个端口以TCP/UDP
被程序使用)
二、解决方案
端口已被其他进程使占用。
1)可以直接尝试服务监听换端口。
2)以管理员权限,运行cmd
控制窗口,执行netstat
命令找到对应进程,确定结束进程不会影响系统正常运行后,结束进程,目标服务再次尝试运行。
>netstat -ano|findstr "[端口号]"
这里以3360
端口为例,实际服务为mysql
服务。
>netstat -ano|findstr "3360"TCP 0.0.0.0:3360 0.0.0.0:0 LISTENING 21316TCP [::]:3360 [::]:0 LISTENING 21316
使用命令行杀死进程。
>taskkill /f /t /im 21316
成功: 已终止 PID 26184 (属于 PID 21316 子进程)的进程。
成功: 已终止 PID 21316 (属于 PID 13440 子进程)的进程。
再次查看端口是否存在,并存在则标识进程杀死成功。
>netstat -ano|findstr "3360"
>
Winnat
服务不让用
1)以管理员权限,运行cmd
控制窗口,执行winnat
端口排除清单查看命令。
使用网络命令netsh interface ipv4 show excludedportrange protocol=tcp
。查看TCP
协议排除的范围端口。
>netsh interface ipv4 show excludedportrange protocol=tcp
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------1738 18371838 19371963 20622063 21622223 23222323 24222423 2522
如果不幸命中,在范围内,那么就重新停止后再启动winnat
服务。
>net stop winnat
Windows NAT Driver 服务已成功停止。
>net start winnat
Windows NAT Driver 服务已经启动成功。
再次查看服务端口范围,可以通过这样的方式启动服务与端口,如果还不行,就尝试换服务端口,换到winnat
排除范围之外。
>netsh interface ipv4 show excludedportrange protocol=tcp
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------50000 50059 *
* - 管理的端口排除。