詞彙表/出問題的時候

監聽連接埠

又稱:開啟的連接埠、是什麼在使用連接埠3000

簡短回答

監聽連接埠是某個程序等待連入連線的網路連接埠,例如在連接埠3000上執行的網頁伺服器。同一時間只能有一個程序在某個連接埠和位址上監聽,所以你才會看到「address already in use」(位址已被使用)這類錯誤。

開發伺服器、資料庫和一些App會開啟監聽連接埠。當你啟動伺服器卻因為連接埠已被占用而失敗,代表另一個程序仍在那裡監聽,常常是同一個伺服器先前啟動的副本。

活動監視器可以顯示程序開啟的檔案和連接埠,但要找出哪個程序占用某個連接埠,最快的方法是在「終端機」中使用lsof指令。

如何找出是什麼在使用某個連接埠

在「終端機」中執行lsof -nP -iTCP:3000 -sTCP:LISTEN,把3000換成你的連接埠號。輸出會顯示指令名稱及其PID。

要列出所有正在監聽的TCP連接埠,請執行lsof -nP -iTCP -sTCP:LISTEN。在前面加上sudo,就會包含其他使用者擁有的程序。

如何釋放連接埠

如果這個程序是你自己啟動的伺服器,請先用正常方式停止它,例如在執行它的終端機視窗中按下Control-C。否則,請用lsof查到的PID執行kill <PID>。只有在它不結束時,才使用kill -9 <PID>。

停止程序前,請先確認程序名稱。有些連接埠屬於macOS服務,例如「AirPlay接收器」,在較新版本的macOS上它會監聽連接埠5000和7000。

如何在活動監視器中查看連接埠

按兩下一個程序,打開「開啟的檔案和連接埠」標籤頁。它會列出該程序開啟的檔案和網路連線。

如何看懂lsof的輸出

每一行是一個開啟中的通訊端。伺服器通常會顯示兩行,一行是IPv4,一行是IPv6,PID相同。

  • COMMAND是程序名稱,預設會截斷為9個字元。加上+c 0就能看到完整名稱:lsof +c 0 -nP -iTCP -sTCP:LISTEN。
  • PID是你傳給kill或ps的程序ID。
  • USER是執行它的帳號。root擁有的程序通常屬於macOS或某個已安裝的服務。
  • NAME顯示位址和連接埠。*:3000表示伺服器在所有網路介面上接受連線。127.0.0.1:3000或[::1]:3000表示只有這台Mac能連線。

如何查看開發伺服器屬於哪個專案

程序名稱往往只是node、python或ruby,看不出執行的是哪個專案。有兩個指令可以回答這個問題。

  1. 用lsof -nP -iTCP:3000 -sTCP:LISTEN取得PID。
  2. 執行ps -o pid,ppid,command -p <PID>,查看啟動它的完整指令。
  3. 執行lsof -a -p <PID> -d cwd,查看它執行時所在的檔案夾,通常就是專案檔案夾。
  4. 如果PPID指向一個shell,代表伺服器是從終端機視窗啟動的。如果那個視窗還開著,就在那裡按下Control-C停止它。

為什麼看起來什麼都沒在執行,連接埠卻被占用了

如果連接埠屬於「AirPlay接收器」,請讓你的伺服器改用其他連接埠,或到「系統設定」>「一般」的「AirDrop與接力」部分關閉「AirPlay接收器」。

  • 先前工作階段的伺服器,還在某個你忘記的終端機標籤頁或視窗中執行。
  • 伺服器是在背景啟動的,或是由編輯器或其他工具啟動的,沒有可見的視窗。
  • 伺服器當掉了,但它啟動的子程序仍然占著連接埠。
  • 某個macOS服務使用了同一個連接埠,例如「AirPlay接收器」會使用連接埠5000和7000。

活動監視器中的「連接埠」欄不是網路連接埠

活動監視器的「CPU」標籤頁中有一個可選用的「連接埠」欄。它計算的是Mach連接埠,這是macOS在程序之間傳遞訊息的一種機制,和top顯示為ports的數字相同。它不會列出網路連接埠。要查看網路連接埠,請使用lsof,或程序資訊視窗中的「開啟的檔案和連接埠」標籤頁。

大家常問的問題

如何查看Mac上是什麼在使用連接埠3000?

在「終端機」中執行lsof -nP -iTCP:3000 -sTCP:LISTEN。它會顯示在該連接埠上監聽的程序名稱和PID。

如何在Mac上終止占用某個連接埠的程序?

用lsof找出它的PID,然後執行kill <PID>。如果它不結束,kill -9 <PID>會立即終止它。

如何列出Mac上所有開啟的連接埠?

執行lsof -nP -iTCP -sTCP:LISTEN列出正在監聽的TCP連接埠。加上sudo,就會包含其他使用者的程序。

「address already in use」是什麼意思?

已經有另一個程序在那個連接埠和位址上監聽。用lsof -nP -iTCP:<port> -sTCP:LISTEN找出它,然後停止它,或改用另一個連接埠。

連接埠明明被占用,為什麼lsof什麼都沒顯示?

這個程序可能屬於其他使用者或root。在同一個指令前面加上sudo,就會包含所有程序。

終止占用連接埠5000或7000的程序安全嗎?

不先確認名稱就不安全。在較新版本的macOS上,這兩個連接埠常被「AirPlay接收器」使用,你可以改到「系統設定」中關閉它。

相關詞條

逐步教學:Docker使用太多記憶體。

想找比活動監視器更好的工具?請參閱Mac上最好用的活動監視器替代方案,或瀏覽詞彙表中的所有詞條。