Linux 终端除障指南 —— 当端口被“绑架”时该怎么办?

作为开发者,当我们满怀期待地输入启动命令(如 ./run_dev.shnpm start),却收到冷冰冰的 Address already in use 错误时,那种挫败感是真实的。这意味着:你要用的“门”(端口)被别人(进程)堵住了。

今天我们就来解决这个问题,只需要三步。

第一步:侦查 —— 谁占用了我的端口?

我们需要一个侦探工具来查看网络端口的使用情况。在 Linux/macOS 上,神器是 lsof (List Open Files)。

假设报错说 80003000 端口被占用,请在终端输入:

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)

如何破案?看这三列:

  1. COMMAND: 那个坏家伙是谁?
    • server (其实是 Python/Uvicorn) 占了 8000。
    • node (Vite/React) 占了 3000。
  2. PID (Process ID): 这是关键! 每个进程都有唯一的身份证号。
    • 占 8000 的 PID 是 72082
    • 占 3000 的 PID 是 945200
  3. NAME / STATE: 找带有 (LISTEN) 字样的行,这表示它正在霸占端口等待连接。

第三步:执法 —— 清理现场

找到 PID 后,我们使用 kill 命令来终止它们。

温柔的清理(推荐):

kill 72082 945200

这相当于告诉程序:“请你把手头工作停一下,正常退出。”

强硬的清理(如果它卡死不退): 如果上面的命令没反应,可以加 -9 参数(强制执行):

kill -9 72082 945200

这相当于直接拔电源,绝不留情。

💡 根源分析:为什么会这样?

通常是因为:

  1. 上次没关好:你之前运行了服务,直接关掉了终端窗口,但后台进程没死。
  2. 意外退出:脚本报错退出了,但它启动的子进程(比如 Python 或 Node)还在跑。
  3. 多开:你不小心开了两个终端窗口运行同一个项目。

你的实战时刻

现在,回到你的终端,试着自己敲一遍:

  1. lsof -i :8000 -i :3000 (确认 PID)
  2. `kill ` (执行清理)
  3. 再次运行启动脚本 (享受绿色的 Success)

发表回复

Your email address will not be published. Required fields are marked *.

*
*