dsh-port-guard:先判讀再處置端口占用的 DSH 插件

前言

本地起 dev server,最常碰到的第一個障礙就是 EADDRINUSE: address already in use。在智能體工作流裏,這個報錯往往出現在任務最開頭,而常見的處理方式很粗:直接 killall nodepkill -f node。結果是把機器上其他正常運行的 Node 服務一併殺掉。

但佔着端口的進程不一定是該殺的:可能是自己上次會話遺留、還在正常服務的 dev server,也可能是別的項目或系統服務。也就是說,EADDRINUSE 有三條處置路徑——複用、換端口、精確 kill——正確做法是先判斷屬於哪種,再決定動作。

dsh-port-guard 就是把這套判讀流程做成插件的一個 DSH 工具。DSH(DeepSeek Harness)的理念是「一切皆插件」,下面介紹它的定位、功能和用法。

這是什麼

dsh-port-guard 是一個 DeepSeek Harness 插件,作者是 PangYiMing,當前版本 0.1.0,許可證爲 MIT。一句話定位:端口占用處置——對佔端口的進程,按情況選擇複用、換端口或精確 kill。

它解決的問題是:把「端口被佔」從一次粗暴的 kill 變成一次有依據的判讀,既不誤殺別人的進程,也不白白重啓自己還活着的 dev server。

核心功能

定位與取證

./scripts/port-guard.sh 8080

8080 換成實際被佔的端口。腳本會打印佔用進程的完整身份信息:先用 lsof 定位監聽該端口的進程,再用 ps 查看啓動時刻、運行時長、有無控制終端、%cpu 和 rss;用 lsof 的 cwd 定位進程屬於哪個項目;最後用 pgrep 查子進程——有子進程的不要直接殺父進程,先看樹。

判讀組合

取證信息拿到後怎麼判斷?README 給出了幾組典型判讀:

  • PPID=1:父進程已退出,被 launchd 收養——孤兒進程
  • tty=??:沒有控制終端,不是人在終端裏跑的
  • fd0 → /dev/nullfd1/fd2 → 某個 .lognohup cmd > log 2>&1 & 的指紋,說明是 agent 或腳本拉起的
  • etime 好幾天,加 %cpu 0.0,加 rss 極小:掛了很久的殭屍 watcher,可能一直 watch 着源碼目錄,某天突然醒來寫產物
  • tty=ttys00X:人在終端窗口裏起的,殺之前更應該問一聲

三條處置路徑

先判斷屬於哪種情況,再選對應動作,不無腦 kill。

路徑 A,複用。佔端口的是自己項目的 dev server,還在正常服務,複用比重啓快。複用前先確認進程還活着,kill -0 只檢測、不殺:

kill -0 "$PID" && echo alive

路徑 B,換端口。佔端口的是別人的項目或不該殺的進程,繞開即可,不搶殺:

PORT=18080 node index.js

路徑 C,精確 kill。確認是殭屍或殘留進程後,用插件的 kill 模式。它會先發 SIGTERM 給進程一個優雅退出的機會,不行再 SIGKILL:

./scripts/port-guard.sh 8080 --kill

安全紅線

插件內置了五條紅線,是設計約束而不是靠使用者自覺:

  1. EADDRINUSE 不等於該殺,先判斷該不該殺,複用優先於重啓。
  2. 絕不 killall node / pkill -f node,只做精確 PID kill,不誤傷其他正常服務。
  3. PID < 100 絕不殺,那是系統進程。
  4. 別人的進程不殺,換端口繞開。
  5. 命令行看不懂、不確定是什麼時,停下報告用戶,不擅自殺。

安裝與啓用

兩種安裝方式。README 註明,第一種要等插件發佈到 npm 之後纔可用:

# 發佈到 npm 後
dsh plugin --profile demo add dsh-port-guard

# 或從 GitHub 安裝
dsh plugin --profile demo add github:PangYiMing/dsh-port-guard

兩條命令都會把 dsh-port-guard 裝進 --profile 指定的 profile。

典型用法

按一次真實的端口衝突走一遍:

1、先定位取證:

./scripts/port-guard.sh 8080

2、看輸出判讀。如果是自己項目上次遺留的 dev server,先確認它還活着,活着就直接複用,不必重啓:

kill -0 "$PID" && echo alive

3、如果佔端口的是別人的項目或系統服務,換端口繞開,不動別人的進程:

PORT=18080 node index.js

4、只有確認是殭屍或殘留進程,才走精確 kill:

./scripts/port-guard.sh 8080 --kill

適用場景與注意

適合經常在本機啓動 dev server 的智能體工作流和開發者,尤其是機器上同時跑着多個項目、不希望一次端口衝突演變成誤殺的場景。

兩點注意:

  • 插件以當前 dsh 進程的權限運行,kill 模式操作的是真實進程。安裝前應檢查源碼與許可證(本插件爲 MIT)。
  • 判讀規則是參考,不是免檢:遇到 tty=ttys00X 這類「有人在終端裏跑」的進程,殺之前先向用戶確認。

小結

dsh-port-guard 的價值不在 kill 本身,而在 kill 之前的判讀:EADDRINUSE 有三條路,無腦 kill 只是其中最差的一條。把定位、取證、判讀、處置固化成腳本和安全紅線,端口衝突的處理就不再靠碰運氣。

  • 社區目錄頁:https://www.skillhub.cn/plugins/PangYiMing/dsh-port-guard (第三方社區目錄,非官方應用商店)
  • GitHub 倉庫:https://github.com/PangYiMing/dsh-port-guard
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜