Linux 终端除障指南 —— 当端口被“绑架”时该怎么办?
作为开发者,当我们满怀期待地输入启动命令(如 ./run_dev.sh 或 npm start),却收到冷冰冰的 Address already in use 错误时,那种挫败感是真实的。这意味着:你要用的“门”(端口)被别人(进程)堵住了。
今天我们就来解决这个问题,只需要三步。
第一步:侦查 —— 谁占用了我的端口?
我们需要一个侦探工具来查看网络端口的使用情况。在 Linux/macOS 上,神器是 lsof (List Open Files)。
假设报错说 8000 和 3000 端口被占用,请在终端输入:
lsof -i :8000 -i :3000
命令解析:
lsof: 列出当前系统打开的文件(在 Unix 中,网络连接也被视为文件)。-i :8000: 筛选出跟网络相关(Internet)且端口是 8000 的进程。- 多写几个
-i可以同时查多个端口。
第二步:分析 —— 读懂线索
运行上面的命令后,你会得到类似这样的输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
server 72082 wangxu 6u IPv6 920830 0t0 TCP *:8000 (LISTEN)
node 945200 wangxu 22u IPv4 10242474 0t0 TCP localhost:3000 (LISTEN)
如何破案?看这三列:
- COMMAND: 那个坏家伙是谁?
server(其实是 Python/Uvicorn) 占了 8000。node(Vite/React) 占了 3000。
- PID (Process ID): 这是关键! 每个进程都有唯一的身份证号。
- 占 8000 的 PID 是 72082。
- 占 3000 的 PID 是 945200。
- NAME / STATE: 找带有
(LISTEN)字样的行,这表示它正在霸占端口等待连接。
第三步:执法 —— 清理现场
找到 PID 后,我们使用 kill 命令来终止它们。
温柔的清理(推荐):
kill 72082 945200
这相当于告诉程序:“请你把手头工作停一下,正常退出。”
强硬的清理(如果它卡死不退):
如果上面的命令没反应,可以加 -9 参数(强制执行):
kill -9 72082 945200
这相当于直接拔电源,绝不留情。
💡 根源分析:为什么会这样?
通常是因为:
- 上次没关好:你之前运行了服务,直接关掉了终端窗口,但后台进程没死。
- 意外退出:脚本报错退出了,但它启动的子进程(比如 Python 或 Node)还在跑。
- 多开:你不小心开了两个终端窗口运行同一个项目。
你的实战时刻
现在,回到你的终端,试着自己敲一遍:
lsof -i :8000 -i :3000(确认 PID)- `kill ` (执行清理)
- 再次运行启动脚本 (享受绿色的 Success)