見慣れない Mac プロセスの調べ方
アクティビティモニタにはアプリ、ヘルパー、エージェント、デーモン、システムサービスが表示されます。名前だけでは、正常なプロセスかどうかは分かりません。複数のソフトが同じような名前を使うことも、マルウェアが名前をまねることもあります。実行ユーザ、パス、親プロセス、コード署名、リソースの推移、動き始めたきっかけをあわせて確認します。
表示 > すべてのプロセス を選び、自分のアカウントだけの一覧にしないでください。ユーザ、CPU 時間、スレッド、種類といった列を追加すると便利です。プロセスをダブルクリックすると、親プロセス、開いているファイルやポート、直近の統計を確認できます。Apple の アクティビティモニタのガイド には、階層表示やシステムプロセス表示もあります。プロセスをサンプル は、すぐ終了させずに、止まったように見えるあいだスレッドが何をしているかを短時間記録します。
いちばん心配されがちなもの
- kernel_task はカーネルの処理を表します。高い CPU 使用率が温度制御に関係することはありますが、それだけでは判断できません。kernel_task の CPU 使用率が高いときで確認手順を説明しています。
- WindowServer はアプリが描いた内容を合成して画面に表示します。ディスプレイやウィンドウが増えると負荷も上がります。WindowServer の CPU 使用率が高いときを参照してください。
- mds、mds_stores、mdworker は Spotlight の索引を作ります。mds と mdworker の CPU 使用率が高いときで扱っています。
- Google Chrome Helper は Chrome のタブ、拡張機能、GPU、ネットワークなどの処理です。Chrome Helper の CPU 使用率が高いときを参照してください。
自分では起動していないバックグラウンドデーモン
これらは自分で動かさなくても動き、ほぼいつも問題ありません。
- launchd は最初のユーザ空間プロセス(PID 1)で、多くのサービスを管理します。すべてのサービスの直接の親とは限りません。常に動いているのが役目です。
- trustd は、アプリの起動時や安全な接続時に証明書とアプリ署名を確認します。アプリを開いたときの短いスパイクは正常です。
- nsurlsessiond はバックグラウンドのネットワーク転送を扱います。iCloud、アプリのダウンロード、アップデートなどです。同期やダウンロード中に上がり、終わると落ち着きます。
- cloudd と bird は iCloud 同期を動かします。サインイン直後や iCloud に大量のファイルを追加した直後は忙しく動き、その後静かになります。
- coreaudiod はシステムのオーディオエンジンです。軽いのが普通で、高い CPU が続くときは、不調なオーディオアプリやプラグインが原因のことがあります。
- photoanalysisd は、人物や物体の認識などのために写真を解析します。電源、温度、ライブラリの状態に応じて処理のタイミングが変わります。
- backupd は Time Machine がバックアップを実行している状態です。バックアップ中は忙しく動くのが想定どおりです。
- syspolicyd はアプリの評価を含む、システムのセキュリティ方針の適用を助けます。アプリのインストール中や初回起動時のスパイクには文脈があります。関係のない作業が続くときは、まだ計測する価値があります。
正常か固まったかは、タイマーではなくパターンです
相関と進捗を見てください。アプリを開いたあと、ドライブを接続したあと、同期を始めたあとに上がり、作業を進めて落ち着いていくプロセスは、妥当な振る舞いです。進捗のない高い CPU の継続、メモリの急増、繰り返しのクラッシュ、同じきっかけのあとに始まるスパイクは、調査の対象です。強制終了の前に、サンプル、開いているファイルの活動、ログを比べてください。多くのシステムサービスは、要求しているアプリや起動ポリシーがまだ必要としているため、再起動します。
サードパーティのソフトでは、実行パスが想定どおりのアプリやベンダーのサポート場所にあり、署名がそのベンダーのものであることを確認してください。Apple のサービスでは、起動設定を変更したり削除したりすることが正しい対処になることはほとんどありません。サービスに仕事を渡しているクライアント、ファイル群、デバイス、ネットワーク操作を特定してください。
終了する前に所有者を確かめる
アクティビティモニタでプロセスをダブルクリックすると詳細を確認できます。ターミナルでは、表示名ではなく PID を指定します。
PID=1234
ps -p "$PID" -o pid=,ppid=,user=,etime=,comm=
lsof -p "$PID" | head
親プロセスと実行パスは一般的な helper を起動元アプリに結び付け、開いているファイルは作業中のプロジェクト、ライブラリ、デバイス、データベースを示します。第三者アプリのパスなら変更せず署名を確認できます。
codesign -dv --verbose=4 "/path/to/the/binary" 2>&1
見慣れた名前が予想外のパスや署名者を持つ場合は調査に値します。知らない名前でも署名済み Apple システム領域にあるだけなら疑わしくありません。子プロセスを強制終了する前に所有アプリを終了し、helper が落ち着くか終了するか確認してください。
仕組み: launchd とオンデマンドサービス
launchd(PID 1)は多くのバックグラウンドサービスを管理します。そのすべてが常時動くわけではなく、ネットワーク接続、ファイルの読み込み、アプリからの XPC 要求などに応じて起動するものもあります。処理を終えたあとの終了条件はサービスごとに異なります。強制終了しても、次の要求や再起動ポリシーによって再び動くことがあります。プロセスが存在すること自体ではなく、処理の進み方や使用率の推移を見て判断してください。
説明レイヤーが役に立つところ
アクティビティモニタでは、プロセスの詳細と使用状況を確認できます。Mole の「ステータス」は、分かりやすい説明と推移を補います。ただし、名前に基づく説明だけでは、今動いているプロセスの正体を確認できません。パス、実行ユーザ、署名、実際の動作も確かめてください。
繰り返し使えるプロセス確認
プロセス名、ユーザ、パス、親、署名、CPU とメモリの推移、開いているファイル、きっかけを記録してください。問題が起きているあいだにサンプルし、デーモンに触る前に要求側のアプリや入力を止めてください。この方法は、普通のバックグラウンド作業、固まったベンダーヘルパー、なりすました名前を、プロセス定義の一覧だけよりはるかにうまく切り分けます。