Mac の LaunchAgents と LaunchDaemons とは?削除してもいい?
LaunchAgents と LaunchDaemons は、macOS の launchd に「何をいつバックグラウンドで起動するか」を伝える小さな .plist ファイルを入れたフォルダです。エージェント(agent)は1人のサインイン中ユーザのために動き、画面に何かを表示できます。デーモン(daemon)はシステム全体のために動き、ユーザインターフェイスを持ちません。すでにないアプリのサードパーティ製項目は、たいてい削除できます。/System/Library には触れず、ファイルを移す前にジョブを止めてください。
5つのフォルダ
Apple のlaunchd ガイドには次の場所が載っています。
| フォルダ | 入っているもの | 触ってよいか |
|---|---|---|
~/Library/LaunchAgents |
自分のアカウントだけのサードパーティ製エージェント | はい、慎重に |
/Library/LaunchAgents |
すべてのユーザ向けのサードパーティ製エージェント | はい、管理者パスワードが必要 |
/Library/LaunchDaemons |
サードパーティ製のシステムデーモン | はい、管理者パスワードが必要 |
/System/Library/LaunchAgents |
Apple のエージェント | いいえ |
/System/Library/LaunchDaemons |
Apple のデーモン | いいえ |
man launchd には線引きが書かれています。デーモンはすべてのクライアントに対して1つのインスタンスで動くシステム全体のサービスで、ユーザインターフェイスを表示してはいけません。エージェントはユーザごとに動き、ユーザとやり取りする処理はこちらに置きます。実際には、メニューバーのヘルパーやアップデータはエージェント、VPN サービス、オーディオドライバのヘルパー、バックアップエンジンはデーモンであることが多いです。
バックグラウンド項目のすべてがここにファイルを持つわけではありません。アプリは plist を自分のバンドルの中に持てるため、システム設定 › 一般 › ログイン項目と機能拡張 には、これらのフォルダにないものが表示されることがあります。この画面はMac 起動時にアプリが開かないようにする方法で説明しています。
判断する前に中身を読む
ls -la ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons
plutil -p ~/Library/LaunchAgents/com.example.helper.plist
次の4つのキーで、だいたいの事情が分かります。
| キー | 意味 |
|---|---|
Label |
ジョブの名前。launchctl が使うもの |
Program または ProgramArguments |
実行するもの。確認すべきパス |
RunAtLoad |
ジョブが読み込まれるとすぐ起動する。通常はログイン時か起動時 |
KeepAlive |
止まると launchd が再起動するので、終了しても長続きしない |
上の com.example.helper は例なので、自分のファイル名に置き換えてください。ProgramArguments が削除済みのアプリを指しているなら、そのファイルは残りかすで、取り除いて問題ありません。まだ使っているアプリを指しているなら、削除するとそのアプリのアップデート、同期、ライセンス、VPN、オーディオが壊れることがあります。
削除する方法
先にジョブを止めます。ファイルを移動しても、すでに実行中のジョブは止まらず、ログアウトか再起動まで読み込まれたままです。
自分のアカウントのエージェントの場合:
launchctl bootout gui/$(id -u)/com.example.helper
mv ~/Library/LaunchAgents/com.example.helper.plist ~/.Trash/
/Library/LaunchDaemons のデーモンの場合:
sudo launchctl bootout system/com.example.helper
sudo mv /Library/LaunchDaemons/com.example.helper.plist ~/.Trash/
/Library/LaunchAgents のエージェントは各ユーザのセッションに読み込まれるので、gui/$(id -u)/ の形で止め、ファイルは sudo mv で移します。これらのコマンドには Label の値を使ってください。ファイル名とは違うことがあります。
削除できたかは launchctl print gui/$(id -u)/com.example.helper か sudo launchctl print system/com.example.helper で確認します。サービスが見つからないと報告されれば成功です。その後1日ほどアプリを使ってみて、何か壊れたらファイルを戻して再起動します。
ファイルは残してジョブの読み込みだけ止めるには、次のようにします。
launchctl disable gui/$(id -u)/com.example.helper
launchctl print-disabled gui/$(id -u)
同じ対象に launchctl enable を使うと元に戻ります。
やってはいけないこと
/System/Library/LaunchAgentsと/System/Library/LaunchDaemonsには触らない。読み取り専用のシステムボリュームにあり、macOS のものです。- 会社名だけで判断して削除しない。セキュリティ製品やデバイスドライバの名前が付いたファイルは、その製品が動き続けるための仕組みかもしれず、管理された Mac では会社のポリシーであることもあります。
- まだ使っているアプリの plist を削除して、アップデートの通知だけが消えると期待しない。先にアプリ自身の設定を確認してください。
launchctl unloadと書かれた古いガイドを使わない。Apple のマニュアルでは従来のサブコマンドとされていて、現在の形はbootoutです。
Mole でできること
Mole の アプリ タブにある 起動 セグメントは、これらの項目を一覧にし、各 plist 自身の Label を読み、ヘルパーを所有するアプリの名前で表示します。ログイン項目 や バックグラウンドサービス といった見出しにまとめ、ジョブがすでに存在しないものを指していると プログラムなし と表示します。これは残りかすのよくある目印です。~/Library/LaunchAgents、/Library/LaunchAgents、/Library/LaunchDaemons にある確認済みの launchd plist は、その行のスイッチでオフにしたり、またオンにしたり、ゴミ箱へ移したりでき、Mole はまずジョブを止めます。セキュリティ製品や管理用の製品はロックされたままで、安全に変更できない項目は代わりにシステム設定を開きます。ステータス で見慣れないプロセスがあれば、なぜ実行中? が launchd サービスとその plist を示します。Mole でアプリをアンインストールするときも、そのアプリの起動項目が確認用に表示されます。
よくある質問
LaunchAgents のファイルを削除しても安全?
削除済みのアプリの残りかすなら安全で、まだ使っているアプリのものなら安全でないこともあります。先に plutil -p で ProgramArguments を読み、launchctl bootout でジョブを止めてからファイルをゴミ箱に移し、戻せるようにしておいてください。
LaunchAgent と LaunchDaemon の違いは?
エージェントはサインイン中のユーザごとに動き、そのユーザとやり取りできます。デーモンはシステム全体で1つのインスタンスとして、通常は誰かがサインインする前から動き、ユーザインターフェイスを持ちません。
削除した LaunchAgent が戻ってきたのはなぜ?
それをインストールしたアプリがまだ Mac にあり、次に開いたときかアップデートのときに書き直したからです。ファイルを消すだけでは長続きしないので、アプリ側で機能をオフにするか、アプリをアンインストールしてください。
LaunchAgent がマルウェアのことはある?
あります。常駐型のアドウェアは、再起動後も残るのでここにインストールされがちです。見慣れない Label が、隠しフォルダや一時的なパスにあるものを実行しているなら、よく調べてください。そのパスを正確に検索し、プログラムの署名者を確認します。
削除したあとで再起動は必要?
launchctl bootout を使ったなら不要で、すぐに止まります。ファイルを移動しただけなら、ログアウトか再起動までジョブは読み込まれたままです。