Process Explorer for macOS
Process Explorer for macOS (github.com)
要約
Microsoftは、macOSネイティブのプロセス監視ツール「Process Explorer for Mac」を公開しました。このツールは、ライブプロセスツリー、モジュール/ハンドル/スレッドの検査、システム全体のパフォーマンスグラフ、コード署名検査などの機能を提供し、Swift、SwiftUI、AppKitで構築されています。macOS 14以降が必要で、開発者向けにビルドおよび実行方法も詳細に解説されています。
全文翻訳
Sysinternals Process Explorer for Mac
Sysinternals Process Explorer for Mac は、コアとなる Process Explorer のエクスペリエンスを macOS ネイティブで実装したものです。ライブプロセスツリー、下部ペインでのモジュール/ハンドル/スレッドの検査、豊富なプロセスごとのプロパティ、システム全体のパフォーマンスグラフ、コード署名検査、および Process Explorer のワークフローに相当する macOS 固有の機能を提供します。
このアプリは Swift、SwiftUI、AppKit で構築されており、サンプリングは libproc、sysctl、Mach ホスト統計情報、Security.framework、IOKit、Metal などの公開 macOS API と、オプションの特権ヘルパーサポートによってバックアップされています。
[画像: プロセス詳細とシステム情報を表示する Sysinternals Process Explorer for Mac]
機能
- サービス、自身のプロセス、新規/削除されたプロセス、一時停止中のプロセス、サンドボックス化されたプロセス、パックされたイメージに対して Process Explorer スタイルの色分けを行ったライブプロセスツリー。
- プロセス名ペインは横スクロール可能なメトリック列を備えています。
- プロセスリストの列幅、順序、列セット、選択された列は永続化されます。
- プロセスリストおよび下部ペインリストでのタイプによる選択。
- 切り詰められたセルおよびプロセスパス/コマンドラインの詳細に対する即時ツールチップ。
- スペースバーでのリフレッシュの一時停止/再開。
- File, Options, View, Process, Find, Window, Help コマンドを備えたネイティブメニューバー。
- リフレッシュ、保存、プロセスプロパティ、キル、下部ペイン、ハンドル/DLL検索、ターゲットウィンドウピッカー、システム情報グラフのアクションを備えたツールバー。
- DLL/イメージ、ハンドル/ファイルディスクリプタ、スレッドの下部ペインモード。
- 新しく出現した項目および削除された項目に対する下部ペインの行ハイライト。
- Image, Performance, Performance Graph, Threads, TCP/IP, Security, Environment, Strings タブを備えたプロセスごとのプロパティウィンドウ。
- TCP/IP タブには、ローカルアドレス、リモートアドレス、非同期リバースDNSリモート名ルックアップ、TCP状態、列の永続性が含まれます。
- セキュリティ/署名詳細には、署名者、発行者、証明書チェーン、チームID、公証ステータス、プラットフォーム/アドホックステータス、検証理由、VirusTotal 統合が含まれます。
- メタデータ、署名検証、VirusTotal、Finder で表示、オンライン検索を備えたモジュール/イメージ詳細ウィンドウ。
- ハンドル/ファイルディスクリプタ詳細ウィンドウ。
- Summary, CPU, Memory, I/O, Network, GPU ページを備えたシステム情報ウィンドウ。
- CPU、メモリ、スワップ、ディスクI/O、ネットワークI/O、GPU、およびコアごとのCPU使用率のシステム情報グラフ。
- Apple Silicon におけるパフォーマンスコアと効率コアのラベリングと色分け。
- CPUトポロジー/キャッシュ、メモリ/ページ情報、ストレージ、ネットワークインターフェイス、GPUデバイス機能、OS/マシンデータに関するハードウェア詳細。
- メニューバーのCPU履歴項目。
- プロセスアクション:キル、ツリーキル、一時停止/再開、優先度/nice値設定、再起動、前面表示、プロセスサンプリング、オンライン検索、VirusTotal チェック。
- クロスユーザーおよび特権操作のためのオプションの特権ヘルパーアーキテクチャ。
- DMG作成、署名、公証のためのリリーススクリプト。
要件
- GUIアプリのターゲットとして macOS 14 以降。
- 現在のプロジェクト構成では Xcode 26.6 以降を推奨。
- Swift 5.9 ツールチェーン以降。
project.ymlからProcexpMac.xcodeprojを再生成するためのxcodegen。
必要に応じて xcodegen をインストールしてください:
brew install xcodegen
ビルド
Xcode プロジェクトを生成し、Debug アプリをビルドします:
xcodegen generate
xcodebuild -scheme ProcexpMac -configuration Debug build
Debug アプリは Xcode DerivedData の下に書き込まれます。このマシンではパスは通常以下のようになります:
~/Library/Developer/Xcode/DerivedData/ProcexpMac-czqddcuyalgzfgebjezrhssregtw/Build/Products/Debug/ProcExp (Dev).app
生成されたプロジェクトを Xcode で開くこともできます:
xcodegen generate
open ProcexpMac.xcodeproj
実行
Debug ビルド後、アプリを実行します:
open "$HOME/Library/Developer/Xcode/DerivedData/ProcexpMac-czqddcuyalgzfgebjezrhssregtw/Build/Products/Debug/ProcExp (Dev).app"
DerivedData のサフィックスが異なる場合は、以下のコマンドで製品を見つけてください:
find ~/Library/Developer/Xcode/DerivedData -path '*/Build/Products/Debug/ProcExp (Dev).app' -print
このワークスペースから新しくビルドされたアプリを再起動するには:
app="$HOME/Library/Developer/Xcode/DerivedData/ProcexpMac-czqddcuyalgzfgebjezrhssregtw/Build/Products/Debug/ProcExp (Dev).app"
pids=$(pgrep -f "$app/Contents/MacOS/ProcexpMac" || true)
if [[ -n "$pids" ]]; then kill $pids 2>/dev/null || true; fi
open -n "$app"
バンドルID: 開発用 vs. 公式
資格のない Xcode およびローカルアドホックビルドは、バンドルID com.sysinternals.procexpmac.dev を持つ ProcExp (Dev).app を使用します。そのヘルパーは、個別の launchd および Mach サービスID com.sysinternals.procexpmac.dev.helper を使用します。したがって、開発用アプリ、ヘルパーの承認、設定、LaunchServices の登録は、インストール済みの公式コピーを置き換えるものではありません。
公式IDは、明示的な Developer ID ビルドまたは Azure リリースパイプラインのために予約されています: ProcExp.app、com.sysinternals.procexpmac、および com.sysinternals.procexpmac.helper。ビルドおよび署名スクリプトは、署名または公開する前に、タプル全体を検証します。
検証
完全な Swift パッケージテストスイートを実行します:
swift test
ライブスモークテストを実行します:
swift run ProcexpSmoke
特定のテストスイートを実行します:
swift test --filter ProcexpModelTests
swift test --filter ProcexpNetworkTests
swift test --filter ProcexpSigningTests
TCP/IP テストフィクスチャ
リポジトリには、TCP/IP タブのテスト用の小さなステートフルTCPフィクスチャが含まれています:
swift build --product ProcexpTcpFixture
.build/debug/ProcexpTcpFixture --duration 3600 --remote-host github.com --remote-port 22
フィクスチャはループバックリスナーを開き、ループバック確立接続を作成し、オプションでDNS解決されたリモートTCP接続を開きます。Process Explorer でフィクスチャプロセスを選択し、Properties > TCP/IP を開いてソケットとリモート名解決を検査してください。
特権ヘルパー
このアプリは、よりリッチなクロスユーザープロセス詳細(完全なプロセスリスト、スレッド、モジュール、環境変数)や特権プロセス制御など、昇格された権限を必要とする操作のために、オプションの特権ルートヘルパーを使用できます。ヘルパーは XPC を介して到達する launchd デーモンであり、アプリは SMAppService を使用してそれを登録します。
macOS は、アプリのコード署名とユーザーによる明示的な承認に基づいて SMAppService デーモンの登録をゲートします。アプリは 安定した、アドホックではない ID(配布用には Developer ID Application 証明書、ローカル開発用には自己署名ID)で署名されている必要があり、デーモンは システム設定 ▸ 一般 ▸ ログイン項目と拡張機能 で一度承認する必要があります。以下のセクションでは、Developer ID のインストールとローカルの自己署名テストの両方について説明します。
Developer ID 証明書を使用したテスト(実際のインストール)
これはエンドユーザーが得るのと同じエクスペリエンスです。
DEV_SIGN_IDENTITY="Developer ID Application: NAME (TEAMID)" \
bash Scripts/dev_install_helper.sh
これは Release アプリをビルドし、ヘルパーとその launchd plist を Contents/Library/LaunchDaemons/ に埋め込み、Hardened Runtime とエンタイトルメントで全てをインサイドアウトで署名し、/Applications/ProcExp.app をインストールして起動します。その後、アプリ内で ProcexpMac ▸ Install Privileged Helper… を選択し、システム設定 ▸ 一般 ▸ ログイン項目と拡張機能 でデーモンを承認します。承認後、アプリは特権プロバイダーを採用し、すべてのプロセスを表示します。
Developer ID 証明書を使用しないテスト(ローカル自己署名)
ローカル開発では、使い捨ての自己署名IDを使用して同じ特権コードパスを実行できます。初回実行時にスクリプトは専用キーチェーン(ログインキーチェーンは関与しません)にIDを作成し、署名済みのヘルパー埋め込みアプリをビルドして /Applications にインストールし、起動します:
bash Scripts/dev_install_helper.sh
その後、一度だけ ProcexpMac ▸ Install Privileged Helper… を選択し、システム設定 ▸ 一般 ▸ ログイン項目と拡張機能 でデーモンを承認します。その後は、スクリプトの各実行で署名済みアプリが再ビルドおよび再起動され、ヘルパーが既に有効になっているため、各イテレーションで昇格されたパスが利用可能になります:
bash Scripts/dev_install_helper.sh # Debug (デフォルト), 高速
CONFIGURATION=Release bash Scripts/dev_install_helper.sh
RESTART_HELPER=1 bash Scripts/dev_install_helper.sh # ヘルパーコードを変更した後
注:
- スクリプトはデフォルトで Debug ビルドを使用し、"ProcexpMac Dev" 自己署名IDで署名されます。
.devアプリおよびヘルパー識別子を持つ/Applications/ProcExp (Dev).appをインストールします。SMAppServiceはデーモン登録をアプリの署名と場所に紐付けるため、同じIDのビルドを再インストールすると開発用ヘルパーが登録されたままになります。 - アプリの変更は再起動時に有効になります。ルート ヘルパー は既にロードされたバイナリを実行し続けるため、ヘルパー自体のコードを変更した場合は
RESTART_HELPER=1(sudo を求めます)を渡してください。 - 企業管理下の Mac では、
codesignがログインキーチェーンに触れる際にキーチェーンパスワードを求めたり、ログインキーチェーンがローテーション後に同期から外れた場合にアカウントパスワードを拒否したりすることがあります。スクリプトが作成する専用キーチェーンは、これを完全に回避します。
検証とクリーンアップ
デーモンが root として登録され、実行されているか確認します:
launchctl print system/com.sysinternals.procexpmac.dev.helper
明示的な Developer ID インストールについては、公式サービスを代わりに検査します:
launchctl print system/com.sysinternals.procexpmac.helper
登録が成功した場合、プロセスリストには以前は非表示だったクロスユーザーおよびシステムプロセスが表示されます。デーモンが登録されているがまだ有効になっていない場合は、システム設定 ▸ 一般 ▸ ログイン項目と拡張機能 で承認するとアクティブになります。繰り返し再インストールすると、以前に記憶された承認がクリアされる場合があり、その場合は macOS が再度承認を求めます。登録が完全に拒否された場合(例:アドホック署名)、アプリはヘルパーが登録できなかったことを報告し、特権なしモードで続行します。
インストールされたアプリを削除し、ヘルパーの登録を解除します:
bash Scripts/dev_uninstall_helper.sh
クリーンアップスクリプトはデフォルトで開発用タプルを使用します。代わりに明示的な Developer ID テストインストールを削除するには、以下を実行します:
PROCEXP_LOCAL_FLAVOR=official bash Scripts/dev_uninstall_helper.sh
終了したら、使い捨ての署名キーチェーンを削除します:
security delete-keychain "$HOME/Library/Keychains/procexp-dev.keychain-db"
ヘルパーアーキテクチャと完全な Developer ID 署名/公証パイプラインについては、Helper/README.md および docs/RELEASE.md を参照してください。
リリースビルド
リリースDMGをビルドします:
bash Scripts/build_release.sh
このローカルアドホックコマンドは、ProcExp (Dev).app を含む build/ProcExp-Dev.dmg を作成します。Developer ID 署名用の標準アプリを準備するには:
PROCEXP_BUILD_FLAVOR=official PACKAGE_DMG=0 bash Scripts/build_release.sh
Developer ID クレデンシャルを設定した後、リリースビルドに署名して公証します:
bash Scripts/sign_notarize.sh
完全なリリースパイプラインについては、docs/RELEASE.md を参照してください。
プロジェクトレイアウト
- App - SwiftUI/AppKit GUI アプリケーションコード。
- Sources/ProcexpModel - 共有モデルタイプ、プロバイダー、フォーマット、列、および色分けルール。
- Sources/ProcexpSampling -
libprocおよびsysctlを使用した特権なしプロセスサンプリング。 - Sources/ProcexpNetwork - ソケット列挙およびシステムGPU使用率。
- Sources/ProcexpSigning - コード署名、SHA-256、キーチェーン、および VirusTotal サポート。
- Sources/ProcexpGraphs - AppKit グラフビューおよび SwiftUI ラッパー。
- Sources/ProcexpActions - プロセスアクションおよび確認メタデータ。
- Sources/ProcexpAutostart - launchd/自動起動検出。
- Sources/ProcexpPrivileged および Sources/ProcexpHelper - 特権ヘルパークライアントおよびデーモン。
- Tests - Swift パッケージテスト。
- Scripts - ビルド、アイコン、署名、公証、リリーススクリプト。
- docs - 実装、リリース、プロジェクトノート。
注記
macOS は、すべての Process Explorer データソースを公開 API 経由で公開しているわけではありません。macOS がアクセスを拒否した場合や、サポートされている API を介してメトリックが利用できない場合、UI はデータを偽装するのではなく、値を空白のままにします。一部の詳細情報は、同じユーザーのプロセスに対してのみ、または特権ヘルパーがアクティブな場合にのみ利用可能になります。