TechMoon 科技月球
WordPress、SEO 與 AI 工具實測指南
TechMoon 科技月球
WordPress、SEO 與 AI 工具實測指南

Mac 遇到 port 3000 已被占用,標準解法是開終端機打 lsof 抄 PID 再 kill。開源工具 Port Radar 把這條流程收進選單列:每 2.5 秒掃描監聽埠、標出孤兒程序、SIGTERM 四秒後升級強制終止,還能自動裝 cloudflared 分享 localhost。DMG 未公證、只編 arm64 等安裝邊界一併整理。
用 AI 摘要這篇文章:
在 Mac 上跑本地開發,總會撞上 EADDRINUSE 或「port 3000 already in use」這類報錯。多半不是程式碼出事,而是上一次的 Vite、Next.js 或 Python 服務還在背景活著。標準解法你大概背得出來:開終端機、lsof -i :3000、抄下 PID、砍掉,前後三十秒。難處在它不留下任何累積:哪個埠屬於哪個專案、哪個服務是終端機視窗關掉後還賴著不走的殘留,每次都得重新查一遍。
Port Radar 是把這條指令鏈搬進 Mac 選單列的開源工具,以 Apache-2.0 授權釋出,用 Swift 寫成原生 App。它常駐選單列,持續列出所有監聽中的 TCP 埠,照專案歸組,可以直接結束程序,也能開一個臨時公開網址把 localhost 分享給別人。專案很年輕:2026 年 8 月初才在 GitHub 建立,由一位開發者獨力維護,第一個正式版 v0.1.0 在 8 月 21 日掛上 release,之後登上 Product Hunt,官方徽章標記 featured、數字 85。系統需求分兩檔:掃埠與程序管理要 macOS 14 以上,AI 問答要 macOS 26 加上支援 Apple Intelligence 的機型。
我把它 0.1.0 的 DMG 下載回來掛載驗過簽章,讀完整個 repo 的原始碼,也在自己的終端機重跑它掃埠用的那組 lsof 參數。接下來就照「它做了什麼、比終端機多做了什麼、裝之前該知道什麼」的順序講。

先拆掃描這層,因為它是整個工具的地基。原始碼裡 PortScanner 執行的是系統內建的 /usr/sbin/lsof,參數固定為 -iTCP -sTCP:LISTEN -P -n,再加 -F pn 要求欄位式輸出方便解析。-P 與 -n 的作用是停用埠名轉換與 DNS 反解,這也是老手查埠時會加的加速參數。換句話說,它看到的資料和你手打 lsof 完全同源,差別在它每 2.5 秒自動跑一輪(間隔可在設定調整),而且把前後兩輪的結果做差集,新增與消失的埠都會被記下來。
我把同一組參數在自己的終端機重跑了一次:機器上數十個監聽埠一次列出,包括我臨時啟動的 python3 -m http.server 8128,程序與埠號都對得上。真正的加工在下一層:它對每個 PID 呼叫 macOS 原生 API 補齊資訊,用 proc_pidpath 拿執行檔路徑、KERN_PROCARGS2 拿完整命令列、kinfo_proc 拿父程序與啟動時間、PROC_PIDVNODEPATHINFO 拿工作目錄。這些是 lsof 預設不會給你的欄位,也是後面孤兒判定與專案歸組的原料。有個小細節:Port Radar 自己不監聽任何埠,所以不會出現在它自己的清單裡。
清單本身也有幾個可調的過濾器,都在設定裡:埠號範圍(預設全開)、程序名關鍵字白名單(填了就只顯示符合的)、系統程序預設會顯示但可以隱藏,另外能開啟新監聽埠的通知。這些預設值偏向「先全部給你看,再讓你自己收斂」,對第一次用的人比較不容易漏看,缺點是系統程序多的機器上清單會比較長。
終端機的 lsof 給你程序名與 PID,判斷「能不能砍」靠的是你的記憶。Port Radar 在原始碼裡對每個程序多算了一個孤兒判定:程序不在系統路徑(如 /System/、/usr/libexec/)下,而且父程序已經消失;或者父程序是 launchd,但命令列長得像開發伺服器,出現 node、vite、next、python、docker 這類關鍵字,或工作目錄認得出是個專案。這個判定對準的是真實情境:終端機視窗關了、Vite 還佔著 5173;AI 工具臨時起的本地服務跑完沒收尾。這些正是埠占用抱怨的大宗來源。
專案歸組是另一個增量。它從程序的工作目錄往上走,最多十二層,找到 .git 就當成專案根目錄;沒有 .git 也認得 package.json、pyproject.toml、go.mod、Cargo.toml、Gemfile、docker-compose.yml 這類標記檔。框架判定先看命令列關鍵字,再看 package.json 的相依。多專案並行時,3000、5173、8000 各自屬於哪個 repo,一眼可辨,不用再靠回想。它甚至能直接把該專案丟回你的編輯器,內建的偵測清單認得 Cursor、VS Code、Zed 與 IntelliJ、WebStorm、PyCharm 這十款 JetBrains 工具,連 OpenAI 的桌面應用也在清單上。
對占用埠的程序按停止,它先送 SIGTERM,給服務四秒緩衝(每 250 毫秒檢查一次存活),沒退就自動升級成 SIGKILL 強制終止,再等最多兩秒確認死亡。換成白話:正常的本地服務有機會自己收尾寫完 log,頑固的殭屍程序也躲不掉。除了這個標準流程,也保留立即強制終止的選項,兩種都要求再點一次確認。
有個工程細節:macOS 的系統警告框會把選單列的面板整個收起來,所以它把確認介面做成面板內的第二步,而不是彈系統對話框。另外它不以 root 權限執行,看得到、殺得到的程序限於你自己帳號擁有的那些。開發伺服器幾乎都落在這個範圍,代價是系統程序與其他使用者的服務它動不了,而那些通常也正是你不想誤砍的對象。
本地服務跑起來後想給同事或手機看,傳統路線是自己裝 ngrok 或 cloudflared,再記一組隧道指令。Port Radar 把這步收進選單:對某個埠按分享,它在背景執行 cloudflared tunnel --url http://127.0.0.1:埠號,從輸出裡抓出 trycloudflare.com 結尾的隨機 HTTPS 網址,自動複製到剪貼簿;埠的程序消失時,隧道跟著自動關閉。這就是 Cloudflare 官方的 Quick Tunnel 機制:不用帳號、不用固定網域,流量經過 Cloudflare 網路,官方把它定位為臨時預覽用途,不適合當正式服務的長期入口。
攤開看第一次按分享時發生的事。你沒裝過 cloudflared 的話,它當場從 GitHub 的 cloudflared 官方 repo 下載對應架構的壓縮包,固定抓最新 release,解開放在 ~/Library/Application Support/Port Radar/ 底下,設成可執行,然後用 xattr 刪掉 macOS 附加在檔案上的隔離標記,讓 Gatekeeper 不再攔這顆執行檔。這條供應鏈有幾個特性:下載來源是官方 repo,資產本身也帶 Cloudflare 的開發者簽章,但版本沒有釘選、也沒有再做一層 checksum 驗證。它不看 PATH 裡有沒有現成的 cloudflared,只認自己快取的那份,所以就算你用 Homebrew 裝過,它照樣再下載一份。方便是真的,這條信任鏈的取捨留在你手上。
分享過程的狀態也做成看得見的:按下分享後會先進入下載、啟動中的階段,等它從 cloudflared 的輸出解析出隨機網址才轉為上線,網址一到手就自動複製好;開著的隧道集中在一個清單裡,可以隨時複製網址或關掉,埠的程序結束時對應的隧道也會被自動收掉,不會留下斷了線還掛著的 cloudflared 程序。
對一個陌生程序,它可以把這個程序的上下文整理成一段文字,交給 Apple Intelligence 在裝置上回答「這是什麼、能不能停」。餵給模型的內容從原始碼可以確認:埠號、PID、程序名、完整命令列、執行檔路徑、工作目錄、啟動時間、已運行時間、專案名稱與框架等。系統提示也寫得很保守:只根據給定的上下文回答,上下文裡沒有的就說不知道,不要編造系統狀態。
兩個邊界先講清楚。一是這個功能走 Apple 的 FoundationModels 框架,系統門檻是 macOS 26 以上加上支援 Apple Intelligence 的機型;原始碼把不可用的情況分成三種提示:機型不支援、系統裡沒開啟 Apple Intelligence、模型還在下載準備中。機器不支援時,問答入口還在,點開才會看到對應的不可用提示,而原始碼裡沒有任何改連雲端模型的備援路徑。macOS 14 或 15 的機器,掃埠、結束程序、隧道分享都照常可用,只是少了問答。二是回答品質我沒有實測,這類對話功能需要實際操作介面才知道水準;能從原始碼確認的是資料範圍被限定在程序上下文,且模型在裝置端運算。把它當「幫你讀命令列的助手」,最終該不該砍還是你自己決定。

整個 App 的對外連線也查過:我把 66 個檔案的原始碼掃過一遍,唯一的網路請求是下載 cloudflared 那一處。沒有遙測、沒有分析套件、沒有更新檢查器。對一個要看你所有監聽埠程序資訊的工具來說,這是加分題。
先從簽章狀態講起。我把 0.1.0 的 DMG(1.1MB)掛載起來親自驗:簽章是 adhoc,也就是開發者在自己機器上的自簽,沒有 Developer ID 的 Team ID,Gatekeeper 的 spctl 檢查直接判拒絕。第一次打開會被系統擋下,要到系統設定的隱私與安全性裡按一次開放。這在獨立開發者的免費工具裡很常見,不是它特別危險,但你要知道自己在按什麼。
架構這關要分開看。官網下載區寫「Apple Silicon & Intel」,但我掛載的這份 DMG 裡,執行檔只編了 arm64 單一架構。對照 repo 的 Makefile,釋出版是用 swift build -c release 編的,這個指令只編當前機器的架構,所以從 Apple Silicon 機器打包出來就是 arm64。Intel Mac 的使用者目前得走原始碼自行編譯一途;repo 沒有 Xcode 專案,用 Swift Package Manager 管理,官方給的流程是 clone 之後一行 make run,需要的是 Xcode 附帶的工具鏈,沒有其他相依。
剩下的變數是成熟度。一位貢獻者、30 次提交、68 顆星、單一版本 v0.1.0,repo 建立到現在約一個月。功能面從掃描到隧道是完整的,但 issue 數量、文件厚度、社群檢驗都還很薄,把它當 1.0 產品期待會失望,當一個思路清晰的早期工具看則剛好。
| 做法 | 查占用 | 孤兒判定 | 結束程序 | 分享 localhost | 原始碼 |
|---|---|---|---|---|---|
| 終端機手動(lsof+kill+cloudflared) | 自己下指令 | 無,靠記憶 | 抄 PID 手動砍 | 自裝工具加指令 | 無 App |
| Port Radar | 2.5 秒自動輪詢 | 有,父程序消失即標記 | SIGTERM 四秒後升級 SIGKILL | 選單一按,自動裝 cloudflared | Apache-2.0 開源 |
| Port Guard | 圖形介面查詢 | 無 | 圖形介面操作 | 無 | 封閉源碼 |
和同樣把 lsof 包成圖形介面的 Port Guard 相比,兩者解的是同一個痛,分歧在路線:Port Radar 走開源加上原始碼可驗證這條路,多做了孤兒判定、專案歸組與隧道分享;代價是未公證的安裝體驗與很早期的版本號。想要「打開就能用、不管裡面長怎樣」的人,封閉源碼的工具不一定比較差,只是你把信任交出去的方式不同。
適合的畫像很具體:Mac 上同時跑多個本地服務的人,前端加後端加 Docker,外加 AI 開發工具鏈隨手起的臨時服務,埠占用是日常而非意外。這類選單列常駐的小工具在 Mac 生態本來就有一席之地,從藍牙電量顯示這類輕量資訊到 Port Radar 這種帶操作能力的工具,共通點都是把「偶爾要查的事」變成「一直在那裡的狀態」。
反過來說,幾乎不跑本地服務的 Mac 使用者,用不到它;需要固定網域、存取控制或長期上線的隧道,該走完整的 Cloudflare Tunnel 或直接部署,Quick Tunnel 的隨機網址撐不起正式流量;已經把 lsof、ps、kill 用的很順、也不想多一個常駐程序的人,它對你的增量最小。還要澄清一個容易誤會的點:它看的是「誰在聽哪個埠」,不看封包內容,需要流量層級觀察的人要找的是 Sniffnet 那類網路監控工具。
授權是 Apache-2.0,LICENSE 與 NOTICE 兩個檔案都齊備:商用、修改、再散布都可以,條件是保留版權聲明、附上 NOTICE,改過的檔案要標註。官方網站在 portradar.devmesh.xyz,原始碼在 GitHub 的 juansebsol/port-radar-mac。安裝有兩條路:從 GitHub Releases 下載 DMG 拖進應用程式,第一次啟動手動放行一次;或者 clone 原始碼後 make run 自行編譯,偏好終端機的人也可以照官方 release notes 用 xattr -cr 清掉隔離屬性再開。作者在 Makefile 裡留好了 Developer ID 與公證的參數位,看來有補上正式簽章的計畫,在那之前每次安裝都要過一次手動放行。
裝起來之後的日常形態:它只在選單列活動,不佔 Dock 位置,可以設定登入時自動啟動。想確認它在你機器上活著,官方文件給了一個現成的測法:隨便開個終端機跑 python3 -m http.server 8128,幾秒內清單上應該出現一個 Python 的監聽列,對它按停止再回終端機看程序是不是真的收掉了。這也是我建議的第一次使用方式:拿一個你自己起的拋棄式服務練手感,比直接對正在跑的正式專案下手安全得多。而因為它是開源的,這篇裡講的每個行為你都可以翻原始碼對照,不需要相信任何人的轉述,包括我的。
一句話收尾:Port Radar 沒有發明新東西,它把你本來就會打的那串指令變成常駐的狀態列,並補上孤兒判定與專案歸組這兩個 lsof 給不了的判斷線索。如果你的 Mac 上永遠有幾個說不清來歷的監聽埠,它值得一次嘗試;裝的時候,記得先看懂上面那三個邊界。