
███████╗ ██████╗ ███╗ ██╗ █████╗ ██████╗
██╔════╝██╔═══██╗████╗ ██║██╔══██╗██╔══██╗
███████╗██║ ██║██╔██╗ ██║███████║██████╔╝
╚════██║██║ ██║██║╚██╗██║██╔══██║██╔══██╗
███████║╚██████╔╝██║ ╚████║██║ ██║██║ ██║
╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═╝
あなたのマシンで何が動いているのかを把握しましょう。
ポートが既に使用されているたびに lsof -iTCP -sTCP:LISTEN | grep ... を実行し、さらに1分かけてそれがDockerコンテナなのか、別のワークツリーから残ったdevサーバーなのかを調べるのにうんざりしました。そこでsonarを作りました。
localhostでリッスンしているすべてのものを表示し、Dockerコンテナ名、Composeプロジェクト、リソース使用量、クリック可能なURLも表示します。プロセスの強制終了、ログの追跡、コンテナへのシェル接続など、すべてポート番号で行えます。
$ sonar list
PORT PROCESS CONTAINER IMAGE CPORT URL
1780 proxy (traefik:3.0) my-app-proxy-1 traefik:3.0 80 http://localhost:1780
3000 next-server (v16.1.6) http://localhost:3000
5432 db (postgres:17) my-app-db-1 postgres:17 5432 http://localhost:5432
6873 frontend (frontend:latest) my-app-frontend-1 frontend:latest 5173 http://localhost:6873
9700 backend (backend:latest) my-app-backend-1 backend:latest 8000 http://localhost:9700
5 ports (4 docker, 1 user)
brew install raskrebs/sonar/sonar
macOSでは、これによりメニューバーアプリ sonar-tray もインストールされます。
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | bash
最新のバイナリを ~/.local/bin にダウンロードし、必要に応じてPATHに追加します。ターミナルを再起動するか、source ~/.zshrc を実行してください。
Windows (PowerShell) の場合:
irm https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.ps1 | iex
カスタムインストール先:
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | SONAR_INSTALL_DIR=/usr/local/bin bash
特定のバージョンをインストール:
curl -sfL https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.sh | SONAR_VERSION=vX.Y.Z bash
$env:SONAR_VERSION="vX.Y.Z"; irm https://raw.githubusercontent.com/raskrebs/sonar/main/scripts/install.ps1 | iex
go install github.com/raskrebs/sonar@latest
注意:
go installはCLIのみインストールします。メニューバートレイアプリ(sonar tray)はネイティブのSwiftバイナリであり、別途ビルドする必要があります — 以下の トレイアプリ を参照してください。
シェル補完(タブでポート番号を補完):
sonar completion zsh > "${fpath[1]}/_sonar" # zsh
sonar completion bash > /etc/bash_completion.d/sonar # bash
sonar completion fish | source # fish
sonar list # すべてのポートを表示
sonar list --stats # CPU、メモリ、状態、稼働時間を含める
sonar list --filter docker # Dockerポートのみ
sonar list --sort name # プロセス名でソート
sonar list --json # JSON出力
sonar list -a # デスクトップアプリを含める
sonar list -c port,cpu,mem,uptime,state # カスタム列
sonar list --health # HTTPヘルスチェックを実行
sonar list --host user@server # SSHでリモートマシンをスキャン
デフォルトでは、sonarはTCPポートをリッスンしているが開発には関係のないデスクトップアプリやシステムサービス(Figma、Discord、Spotify、ControlCenter、AirPlay、その他のmacOS .app バンドルや /System/Library/ デーモンなど)を非表示にします。-a を指定するとそれらも含められます。
利用可能な列: port, process, pid, type, url, cpu, mem, threads, uptime, state, connections, health, latency, container, image, containerport, , , , ,
sonar info 3000
ポートに関するすべての情報(完全なコマンド、ユーザー、バインドアドレス、CPU/メモリ/スレッド、稼働時間、ヘルスチェック結果、該当する場合はDocker詳細)を表示します。
sonar kill 3000 # SIGTERM
sonar kill 3000 -f # SIGKILL
sonar kill-all --filter docker # すべてのDockerコンテナを停止
sonar kill-all --project my-app # Composeプロジェクトを停止
sonar kill-all --filter user -y # 確認をスキップ
Dockerコンテナはシグナルを送信する代わりに docker stop で停止されます。
sonar logs 3000
Dockerコンテナの場合は docker logs -f を実行します。ネイティブプロセスの場合は lsof でログファイルを特定し、tailします。macOSでは log stream、Linuxでは /proc/<pid>/fd にフォールバックします。
sonar attach 3000 # Dockerコンテナにシェル接続、またはTCP接続
sonar attach 3000 --shell bash # 特定のシェル
sonar watch # 2秒ごとにポーリング、差分を表示
sonar watch --stats # ライブリソース統計(docker stats のように)
sonar watch -i 500ms # より高速なポーリング
sonar watch --notify # ポートのアップ/ダウン時にデスクトップ通知
sonar watch --host user@server # リモートマシンを監視
sonar graph # どのサービスが相互に通信しているかを表示
sonar graph --json # 構造化出力
sonar graph --dot # Graphviz DOT形式
リッスンポート間の確立された接続(例: バックエンドがpostgresに接続している)を表示します。
プロジェクトの予想ポートセットを保存し、すべてが起動しているか確認したり、停止したりできます:
sonar profile create my-app # 現在のポートをスナップショット
sonar profile list # 保存されたプロファイル一覧
sonar profile show my-app # プロファイル詳細を表示
sonar up my-app # 予想ポートが実行中か確認
sonar down my-app # プロファイル内の全ポートを停止
sonar wait 5432 # ポートが接続を受け付けるまでブロック
sonar wait 5432 3000 6379 # 複数ポートを待機
sonar wait 5432 --timeout 30s # 30秒でタイムアウト
sonar wait 5432 --http # TCPオープンだけでなくHTTP 200を待機
sonar wait 5432 --http=/health # 特定のエンドポイントをチェック
sonar wait 5432 -i 500ms # カスタムポーリング間隔
sonar wait 5432 -q # 出力なし、終了コードのみ(スクリプト用)
docker compose up -d やバックグラウンドサービスのスクリプト化に便利です。--http フラグはTCPソケットだけでなく、実際のHTTP 200-399応答を待機するため、準備が整う前に接続を受け入れるサービスもキャッチします。--http=/health で特定のエンドポイントをチェックします。終了コード: 0(準備完了)、1(タイムアウト)、2(中断)。
docker compose up -d
sonar wait 5432 3000 --timeout 60s && npm run migrate && npm run test
sonar map 6873 3002
ポート6873のサービスをポート3002でも利用可能にするプロキシです。
sonar next # 3000から最初の空きポート
sonar next 8000 # 8000から最初の空きポート
sonar next 3000-3100 # 範囲内の最初の空きポート
sonar next -n 3 # 連続する3つの空きポート
sonar next --json # JSON出力
sonar open 3000 # ブラウザで開く
sonar tray # ライブ統計付きメニューバーアプリ(macOS)
sonar --no-color # 色を無効にする(NO_COLOR環境変数も認識)
--stats フラグはプロセスごと、コンテナごとのリソース使用量を取得します。Dockerコンテナの場合は、Docker Engine APIを使用して正確なコンテナごとのメトリクスを取得します。--stats なしの場合、sonarは即座に結果を返します。
sonar はオプションのデフォルト設定を ~/.config/sonar/config.yaml から読み取ります。このファイルは必須ではありません — なければビルトインのデフォルトが適用されます。コマンドラインフラグは常に設定ファイルよりも優先されます。
スターターファイルを作成:
sonar config init # コメント付きテンプレートを書き込み
sonar config path # ファイルの場所を表示
sonar config edit # $EDITORで開く
設定例:
list:
columns: [port, process, container, image, containerport, url]
sort: port # port | pid | name | type
filter: "" # docker | user | system | "" (すべて)
all: false # デフォルトでデスクトップアプリを含める
color: true # falseに設定して色付き出力を無効化
services: # カスタム/不明なポートにラベル付け
9000: php-fpm
5050: my-dashboard
無効な値は警告とともに無視され、sonarはデフォルトで続行します。
メニューバートレイアプリ(macOSのみ)は、メニューバーにライブポート統計を表示するネイティブSwiftバイナリです。インストールスクリプトまたはGitHubリリースでsonarをインストールした場合、トレイバイナリ(sonar-tray)は自動的に含まれます。
go install でインストールした場合は、手動でビルドします:
swiftc -O -o sonar-tray tray/SonarTray.swift -target arm64-apple-macos13
その後、sonar-tray を $PATH 上のどこかに移動し、以下を実行:
sonar tray
lsof を使用)ss を使用)netstat を使用)sonarに貢献してくださった皆さんに感謝します!
composeprojectuserbindip