关于启动服务端口被占用但是查看该端口并没有被监听的情况

今天重新启动mysql服务的时候,提示3306端口被占用. 通过如下命令查看,发现并没有程序占用3306端口.

netstat -lnp | grep 3306  #通过netstat 命令查看

lsof -i:3306  通过lsof命令也可以查看使用3306 端口的句柄

但是都没有发现什么有用线索, 但是实际上重启mysql就是提示端口被占用

于是乎, 放大查找范围.  netstat -anp | grep 3306.  发现有一个tcp链接, 是established状态.  从本机的某个端口链接到了本地的3306端口.

tcp    localhost:3306    localhost:58883   established   (非监听状态,仅是一个tcp链接)

猜测,是因为自己的一个服务已经连接到了数据库3306端口,且建立了链接,并没有断开.  此时, 数据库是因为异常原因导致的数据库关闭.  虽然数据库进程(服务)已经挂掉了,  但是那个奇怪的服务之前建立的链接仍没有被释放掉(close)掉. 所以就看到了这种奇怪的情况,  即mysql服务已经停止,且已经没有在监听端口号3306, 但是因为一个其他的链接仍链接在3306上, 导致启动服务的时候提示端口被占用.

解决方法, 把建立链接的那个服务停止或者重启后.   那个链接丢失了, 这样重启mysql服务就没有问题了.

所以, 端口被占用并不见得是bind的端口被占用, 同样如果存在此端口的established(time wait)的端口, 那么要bind该端口同样会提示端口被占用.    备注: 通过实际发现, time wait的状态的链接也不算释放. 必须close掉才可以.

 

 

此篇文章已被阅读2228 次

Add a Comment

邮箱地址不会被公开。 必填项已用*标注