開發者
Mac 上的連接埠已被占用
一個 TCP 連接埠和位址只能有一個程序監聽。第二個伺服器就會停止並顯示「address already in use」。
症狀
- 開發伺服器停止並顯示「EADDRINUSE」或「address already in use」。
- Docker 因「port is already allocated」而無法發布連接埠。
- 在當機或重新啟動編輯器之前,這個連接埠還沒被占用。
可能原因
- 伺服器的舊副本。先前執行的伺服器仍在背景執行。
- 其他 App。另一個 App 使用相同的連接埠。在 macOS 12 及以上版本中,「AirPlay 接收器」會使用連接埠 5000 和 7000。
- 容器。執行中的容器在 Mac 上發布了相同的連接埠。
如何檢查
找出監聽該連接埠的程序。將 3000 換成你的連接埠。
lsof -nP -iTCP:3000 -sTCP:LISTEN輸出 COMMAND 和 PID 欄位會指出該程序。
若要查看其他使用者的程序,請用 sudo 執行相同的指令。
sudo lsof -nP -iTCP:3000 -sTCP:LISTEN需要管理者密碼。
顯示該程序的更多資訊。
ps -p 12345 -o pid,command尋找發布該連接埠的容器。
docker ps
如何修正
如果是你自己的程序,請在它所在的「終端機」視窗中按 Control-C 停止。
否則,請傳送終止訊號給它,並使用它的 PID。
kill 12345如果它沒有停止,請使用
kill -9。程序將無法儲存資料。如果該程序屬於 macOS,不要停止它。請為你的伺服器選擇其他連接埠。
如果連接埠是 5000 或 7000,請閱讀「Mac 上的連接埠 5000 或 7000 被占用:AirPlay 接收器」。
使用 Kilobat
列出單一程序開啟的通訊端。
kilobat destinations --pid 12345依 PID 結束程序。只有在它沒有停止時才加上
--force。kilobat quit 12345
常見問題
為什麼 lsof 沒有顯示任何結果,連接埠卻被占用?
lsof 只會顯示你有權限檢查的程序。用 sudo 執行即可查看所有程序。
-n 和 -P 有什麼作用?
它們會讓 lsof 不將位址轉換為名稱、不將連接埠轉換為服務名稱。輸出速度更快,並以數字顯示。
資料來源
- lsof(8),macOS 27.2 內建的 man 頁面
- kill(1) 和 ps(1),macOS 27.2 內建的 man 頁面
- Apple 支援:Apple 軟體產品使用的 TCP 和 UDP 連接埠
資料來源檢查日期:2026年10月29日。man 頁面為 macOS 內建版本;在終端機中用 man <name> 開啟。