yutat23/lsoff has 280 GitHub stars and 11 forks. Star changes are not measured yet. Last checked 2026-11-13 22:15 UTC. Last push 2026-11-13.
計測したスター増加
- 24時間
- 履歴を収集中
- 7日間
- 履歴を収集中
- 15日間
- 履歴を収集中
- 1か月
- 履歴を収集中
期間ごとの純増数です。期間は重複しており、日別の値ではありません。未計測の値は空欄です。スター数は注目度の指標であり、品質の保証ではありません。
概要
CLI / TUI that lists listening TCP/UDP ports
開発ツールREADME.ja.md
オリジナルlsoff
Windows / Linux / macOS で LISTEN 中の TCP/UDP ポートを一覧する CLI / TUI。
lsof のポート版、というより「今誰がこのポートを掴んでいるか」をすぐ見つけて、必要ならプロセスを終了するための小さなツールです。
インストール
バイナリは GitHub Releases に付いています(lsoff-darwin-arm64、lsoff-linux-amd64、lsoff-windows-amd64.exe など)。
Windows(WinGet)
winget install yutat23.lsoff
macOS / Linux(Homebrew)
Homebrew tap からインストールできます。Homebrew 6 ではサードパーティ tap を先に trust する必要があります。
brew tap yutat23/tap
brew trust yutat23/tap
brew install lsoff
Go install
go install github.com/yutat23/lsoff@latest
ソースからビルド
git clone https://github.com/yutat23/lsoff
cd lsoff
go build -o lsoff .
タグを push すると(git tag v0.1.0 && git push origin v0.1.0)バイナリをビルドして Release に添付します。
macOS では libproc を使うため CGO が必要です(通常の go build で有効です)。
使い方
lsoff # TUI(stdout が TTY でないときは表を出す)
lsoff 8080 # ポート 8080 を掴んでいるプロセスを表示
lsoff nginx # 名前・パス・PID・cmdline・プロジェクト・サービス名などで検索
lsoff -q "node 8080" # 空白区切りは AND
lsoff -t # TCP だけ(TUI)
lsoff -p # PID が不明な行を隠す
lsoff -u 53 # UDP の 53 番
lsoff --json nginx # 検索結果を JSON で
lsoff -k 8080 # そのポートのプロセスを終了(確認あり)
lsoff -k -y 8080 # 確認なし(パイプ経由では必須)
lsoff -h
lsoff -v
ポート指定時の出力例:
PROTO PORT ADDRESS PID PROJECT PROCESS PATH CMD CWD
tcp 8080 127.0.0.1 41233 lsoff node /usr/local/bin/node /usr/local/bin/node ~/mywork/lsoff
TUI
| 操作 | 動作 |
|---|---|
/ / Search: をクリック / ctrl+f |
検索(ポート・PID・名前・プロジェクト・パス・cmdline。空白は AND) |
検索中の enter |
検索を確定して一覧に戻る |
↑ / ↓ / j / k / ctrl+p / ctrl+n / クリック / ホイール |
移動・選択(検索中も可) |
ctrl+u / ctrl+d / pgup / pgdn |
1 ページ上 / 下へ移動(検索中も可) |
g / G / home / end |
先頭 / 末尾の行へ移動 |
| ヘッダークリック | その列でソート(もう一度で降順) |
s / S |
ソート列を切り替え / 昇降順 |
p |
PID が不明な行を隠す(切り替え) |
4 |
IPv4 の行だけ表示(もう一度で解除) |
6 |
IPv6 の行だけ表示(もう一度で解除) |
y |
選択中の addr:port をコピー |
a |
2 秒ごとの自動更新(切り替え) |
enter / space / ▸ をクリック |
グループ内のソケットを展開・折りたたみ |
h / l / ← / → |
折りたたみ / 展開 |
esc / ctrl+c |
検索をクリア |
r / ctrl+r |
今すぐ再読み込み |
x |
選択中プロセスを終了(確認あり) |
q / ctrl+c |
終了(検索中以外) |
TUI では tcp を緑、udp をアンバーで色分けします。選択中の行は背景色が優先されます。CLI の表はスクリプト向けのため着色しません。プロセス名、cmdline、パスは端末向けに制御文字と ANSI/OSC を除去します。JSON は元の文字列を保持します。
同じプロセスまたは Docker コンテナで、プロトコルとホスト側ポートが同じソケット(例えば IPv4 + IPv6)は、最初 ▸ と +N で折りたたみます。enter で展開すると小さなツリーになります。先頭は ▾、最後の子は └─、それ以外の子は ├─ です。ソケットが 2 つのときは子は └─ だけ、3 つ以上のときは ├─、…、└─ と並びます。ポートやプロトコルが異なるものは別グループになり、Docker は PID の代わりにコンテナ ID でグループを区別します。
4 と 6 のフィルターはどちらか一方を選べます。もう一方のキーで切り替わり、同じキーをもう一度押すと両方の表示に戻ります。
よく使うサービス名(http, postgres, redis, vite, …)は検索でき、フッターの SVC に出ます。3000 番のように名前が一つに決まらないポートは検索エイリアスのみです。echo / chargen などの歴史的ポートは入れていません。JSON は表示名があるとき "service" を付けます。
x のあとに y で実行、n または esc でキャンセルします。kill は一覧時のプロセスと同一かを検証します。Linux は pidfd_open(fd が PID 番号ではなくそのプロセスを指す)、macOS は pbi_start_tvsec / usec を確認してから signal、Windows は開いたハンドルの CreationTime です。Unix ではまず SIGTERM、2 秒残っていたら同じプロセスへ SIGKILL です。Windows は TerminateProcess です。pid 1 と自身は殺しません。
CLI の -k も同じです。同じ PID が IPv4/IPv6 で二重に出ていても一度だけ終了します。パイプから呼ぶときは誤爆防止のため -y が必要です。
制限
- macOS の kill は atomic ではない。 pidfd 相当がない。
pbi_start_tvsec/usecをkill(2)の直前に再確認するが、その隙間で PID が再利用される余地は残る。Linux の pidfd と Windows のプロセスハンドルにはこの隙間がない。 - Windows の cmdline / cwd は
NtQueryInformationProcessを使う。Microsoft は内部 API であり将来変わり得ると説明している。64-bit ビルドは WOW64(32-bit)プロセスの文字列を 32-bit PEB から読む。ProcessCommandLineInformationは 呼び出し側 のポインタ幅で解釈し、取れなければ対象の bitness で PEB のCommandLineにフォールバックする。32-bit の lsoff から 64-bit プロセスの cmdline / cwd は取れない。 - バージョン は
go build時に埋め込まれる。lsoff -vがmain.goと違うときはビルドし直す。
OS ごとの取得方法
外部コマンド(lsof / ss / netstat)には依存しません。
| OS | API |
|---|---|
| Linux | /proc/net/{tcp,tcp6,udp,udp6}、/proc/<pid>/{fd,cmdline,cwd} |
| macOS | sysctl net.inet.{tcp,udp}.pcblist64(全リスナー)、libproc(所有プロセスと cwd)、sysctl kern.procargs2 |
| Windows | IP Helper、QueryFullProcessImageName、NtQueryInformationProcess(cmdline と cwd) |
権限のないプロセスは PID やパス、cmdline が空になることがあります。その場合は root / Administrator で実行してください。
Docker の公開ポートにも対応しています。Unix ソケット経由でローカルの Docker Engine API から公開ポート情報を取得し、OS から取得した一覧に追加します。DOCKER_HOST が unix:// のソケットを指している場合は、そのソケットだけを使います。それ以外の場合は /var/run/docker.sock、$XDG_RUNTIME_DIR/docker.sock(rootless Docker)、~/.docker/run/docker.sock(Docker Desktop)の順に試し、最初に応答したものを使います。DOCKER_HOST がそれ以外の値(tcp://、ssh://、npipe:// など)の場合は、リモートの Engine の公開ポートはこのホストのリスナーではないため、Docker の情報は取得しません。Colima、OrbStack、Rancher Desktop、Podman などのランタイムは、DOCKER_HOST にその unix:// ソケットを指定すれば使えます。実行ユーザーには、ソケットへのアクセス権が必要です。Docker がない場合や、使えるソケットがない場合、API が失敗した場合も、通常のプロセス一覧は表示します。公開ポート情報は、コンテナがホスト側のソケットを所有していることを示すものではありません。
Docker の行は PROCESS に docker:grafana のようなコンテナ名を表示し、TUI の詳細欄にはコンテナ側のポートとプロトコル、コンテナ ID を表示します。PID を持たないため、p / -p で非表示になり、x / -k でコンテナを停止することはできません。
UDP に LISTEN 状態はないため、リモート未接続でポートに bind されているソケットを表示します。
ライセンス
MIT