PortKiller — macOSメニューバーでポート占有プロセスを強制終了するツール
概要
PortKillerは、開発作業中に衝突を起こす「既に使用中のポート」を素早く特定してプロセスを終了できる、macOS向けのメニューバーアプリです。Swift(Swift 6)でネイティブ実装され、macOS 15.0以上をサポートします。メニューバー常駐で手軽に起動でき、開放ポートの一覧表示、対応するPIDの確認、プロセスの強制終了を行えます。開発者がローカルでサーバーを立ち上げられないときの即席対処や、CI前のポート競合確認に便利なツールです。
リポジトリの統計情報
- スター数: 7
- フォーク数: 1
- ウォッチャー数: 7
- コミット数: 5
- ファイル数: 9
- メインの言語: Swift
主な特徴
- macOSメニューバー常駐の軽量UIで即アクセス可能
- 開放ポートをスキャンしてプロセス(PID)を特定
- 選択したプロセスを終了(kill)する操作をワンクリックで実行
- Swift 6 / Swift Package Manager / MITライセンスで開発・配布
技術的なポイント
PortKillerはユーティリティとしてのシンプルさに重点を置いた設計です。コードベースはSwiftで書かれ、Package.swiftが含まれていることからSwift Package Manager(SPM)で管理できる構成になっています。ターゲットはmacOS 15.0以上と明記されており、最新のmacOS APIやSwiftUI/Swiftのランタイム機能を利用しやすい環境を前提としています。
ポート検出とプロセス特定の実装には2つの典型的手法が考えられます。1つはシステムユーティリティ(lsofやnetstat)をProcess(subprocess)で呼び出して出力をパースする方法、もう1つは低レイヤのSocket/Darwin APIやlibprocを直接利用する方法です。どちらを用いるにせよ、出力のパースやPID抽出、ユーザー確認ダイアログ、エラーハンドリング(既にプロセスが消えている、権限不足など)を丁寧に扱う必要があります。プロセス終了は通常SIGTERM→必要ならSIGKILLの順でシグナルを送る実装が安全ですが、root権限や管理者権限が必要な場合はAuthorization Servicesや一時的な権限昇格(正しくはユーザーに確認の上で)を要します。
UIはメニューバーに常駐するため、軽量で即時に状態を示す設計が望まれます。macOSのメニューバーAPI(NSStatusBarあるいは新しいMenuBarExtra系のSwiftUIラッパー)を使って、ポートごとの情報(ポート番号、ローカル/リモート、PID、実行中バイナリ名)を一覧化し、選択アクションで確認ダイアログ→killを行う流れが自然です。非同期処理とUI更新にはSwiftのConcurrency(async/await)やCombineが活躍します。
配布はGitHub Releasesを使ったバイナリ配布や、SIPやサンドボックス要件を考慮したパッケージングが考えられます。オープンソース(MIT)なので、拡張としてポートスキャンの自動化、ホワイトリスト設定、権限管理の改善、ターミナルコマンドとの連携などが追加可能です。ログや操作履歴の保存、i18n対応、macOSのアクセシビリティ対応も実運用での検討ポイントです。
プロジェクトの構成
主要なファイルとディレクトリ:
- .github: dir
- .gitignore: file
- CONTRIBUTING.md: file
- LICENSE: file
- Package.swift: file
…他 4 ファイル
まとめ
ローカル開発でのポート競合を即解消できる、シンプルで実用的なmacOSメニューバー向けユーティリティです。
リポジトリ情報:
- 名前: port-killer
- 説明: Native macOS menu bar app for finding and killing processes on open ports. Perfect for developers.
- スター数: 7
- 言語: Swift
- URL: https://github.com/productdevbook/port-killer
- オーナー: productdevbook
- アバター: https://avatars.githubusercontent.com/u/38668796?v=4
READMEの抜粋:
PortKiller
A native macOS menu bar application for finding and killing processes running on open por…