開發者

Mac 上的連接埠已被占用

一個 TCP 連接埠和位址只能有一個程序監聽。第二個伺服器就會停止並顯示「address already in use」。

適用於:所有目前的 macOS 版本。檢查日期:2026年10月29日

症狀

  • 開發伺服器停止並顯示「EADDRINUSE」或「address already in use」。
  • Docker 因「port is already allocated」而無法發布連接埠。
  • 在當機或重新啟動編輯器之前,這個連接埠還沒被占用。

可能原因

  • 伺服器的舊副本。先前執行的伺服器仍在背景執行。
  • 其他 App。另一個 App 使用相同的連接埠。在 macOS 12 及以上版本中,「AirPlay 接收器」會使用連接埠 5000 和 7000。
  • 容器。執行中的容器在 Mac 上發布了相同的連接埠。

如何檢查

  1. 找出監聽該連接埠的程序。將 3000 換成你的連接埠。

    lsof -nP -iTCP:3000 -sTCP:LISTEN

    輸出 COMMAND 和 PID 欄位會指出該程序。

  2. 若要查看其他使用者的程序,請用 sudo 執行相同的指令。

    sudo lsof -nP -iTCP:3000 -sTCP:LISTEN

    需要管理者密碼。

  3. 顯示該程序的更多資訊。

    ps -p 12345 -o pid,command
  4. 尋找發布該連接埠的容器。

    docker ps

如何修正

  1. 如果是你自己的程序,請在它所在的「終端機」視窗中按 Control-C 停止。

  2. 否則,請傳送終止訊號給它,並使用它的 PID。

    kill 12345
  3. 如果它沒有停止,請使用 kill -9。程序將無法儲存資料。

  4. 如果該程序屬於 macOS,不要停止它。請為你的伺服器選擇其他連接埠。

  5. 如果連接埠是 5000 或 7000,請閱讀「Mac 上的連接埠 5000 或 7000 被占用:AirPlay 接收器」。

使用 Kilobat

  1. 列出單一程序開啟的通訊端。

    kilobat destinations --pid 12345
  2. 依 PID 結束程序。只有在它沒有停止時才加上 --force。

    kilobat quit 12345

常見問題

為什麼 lsof 沒有顯示任何結果,連接埠卻被占用?

lsof 只會顯示你有權限檢查的程序。用 sudo 執行即可查看所有程序。

-n 和 -P 有什麼作用?

它們會讓 lsof 不將位址轉換為名稱、不將連接埠轉換為服務名稱。輸出速度更快,並以數字顯示。

資料來源

資料來源檢查日期:2026年10月29日。man 頁面為 macOS 內建版本;在終端機中用 man <name> 開啟。