打开命令行,端口输入 netstat -ano | findstr ":21",被占回车。用解屏幕上通常会跳出一行字,决办结尾那个四位或五位数,端口就是被占罪魁祸首的PID。我见过太多人卡在这一步,用解对着那一串数字发愣,决办然后跑来问我:“然后呢?端口我该杀谁?”
别急。先看看那个PID对应的被占是什么进程。打开任务管理器,用解切到“详细信息”标签页,决办点一下PID列排序,端口找到那个数字。被占如果它叫svchost.exe或者System,用解那你麻烦大了——这说明21端口被系统级的FTP服务占着,不是随便杀个进程就能解决的。如果是FileZilla Server.exe、Serv-U.exe这类第三方FTP软件,恭喜,问题简单得多。
我上个月刚帮一个同事处理过这事。他装了个老旧的IIS FTP服务,后来又想跑一个Python的FTP测试脚本,结果端口死活起不来。查了半天发现是IIS的FTP服务在后台偷偷运行,他压根忘了自己装过。这种“自己占自己”的案例,比想象中常见得多。解决办法也粗暴:services.msc打开服务管理器,找到FTP Publishing Service,右键停止,再把启动类型改成“禁用”。完事。
如果你确认没有系统服务占用,那就直接干掉那个进程。taskkill /PID 1234 /F,把1234换成你查到的数字。注意,这个命令是强杀,进程来不及保存任何数据。如果你跑着重要的FTP传输任务,先停掉再杀,别手滑。
还有一种情况,杀完进程端口还是被占。别慌,八成是TIME_WAIT状态在作祟。TCP连接关闭后,端口会进入TIME_WAIT状态,默认等两分钟才释放。你查netstat的时候会看到状态栏写着TIME_WAIT,而不是LISTENING。这种不是真占用,等一会儿就好。但如果你急,可以改注册表让系统快速回收端口:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,新建一个DWORD,叫TcpTimedWaitDelay,值设成30(单位秒),重启生效。这招对频繁重启FTP服务的人特别管用,能少等不少时间。
说到底,21端口被占这件事,百分之八十是“你自己忘了自己装过什么”。剩下百分之二十,是某些软件强行绑定了端口不撒手。比如某些安全软件、某些下载工具的加速模块,它们不声不响就占了21。查的时候别只盯着FTP软件看,把系统里所有带“服务”字样的进程都扫一遍。我见过最离谱的一次,是某网盘的自动备份功能把21端口占了,用户死活想不到是它干的。
最后给个排查顺序吧:先看是不是系统FTP服务,再看第三方FTP工具,最后查TIME_WAIT。三步走完,百分之九十九的情况都能解决。剩下那百分之一,可能是你机器上跑着个虚拟机,虚拟机里的系统占了端口——这种时候别折腾了,改你应用的端口号,比跟虚拟机较劲省事得多。