Mac下lsof显示3306端口未占用却可telnet,如何定位并终止进程?
解决Mac下3306端口lsof无结果但telnet可连接的问题
你遇到的这个情况其实是因为lsof默认只检查IPv4的端口监听,而你的telnet连接成功是因为进程在监听IPv6的::1地址,所以常规的lsof -i :3306抓不到它。
先看看你给出的命令执行记录:
± |master ✓| → lsof -i :3306 |2.3.1| montana in ~/workspace ± |master ✓| → telnet localhost 3306 Trying ::1... Connected to localhost. Escape character is '^]'. J 5.6.39|=X%N9r�&a;AtF>E!r>{mysql_native_passwordConnection closed by foreign host.
从telnet的输出能看到它尝试连接的是IPv6地址::1,说明监听进程绑定了IPv6的3306端口,而非(或不仅是)IPv4的127.0.0.1。
如何找到并终止监听进程
方法1:用lsof查询IPv6端口
执行这个命令就能找到对应的进程:lsof -i6 :3306输出里会包含进程的PID,比如类似这样:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 123 root 10u IPv6 0x123456789abcdef 0t0 TCP *:mysql (LISTEN)方法2:用netstat全面排查
如果lsof还是没结果,试试Mac自带的netstat命令,它能显示所有TCP端口的监听状态:netstat -anp tcp | grep 3306输出里的
LISTEN状态行对应的PID就是你要找的,比如:tcp6 0 0 ::1.3306 *.* LISTEN 12345 67890终止进程
拿到PID后,用kill命令强制终止:kill -9 <你的进程PID>要是这个进程是MySQL(从telnet输出里的
mysql_native_password能看出来大概率是),如果你是用Homebrew安装的,也可以用更稳妥的方式停止:brew services stop mysql
补充说明
有些进程会配置成同时监听IPv4和IPv6端口,或者只监听IPv6——因为IPv6的套接字默认也能处理IPv4连接(取决于系统设置),但lsof的-i参数默认只扫描IPv4的套接字,所以必须加上-i6才能看到IPv6的监听情况。
内容的提问来源于stack exchange,提问作者Daniel Kaplan
相关产品推荐
相关产品推荐

