macOSを使っていると、「launchd(ローンチディー)」という名前を目にすることがあります。
launchdは、macOSにおいてプログラムやバックグラウンドサービスの起動・停止などを管理する重要な仕組みです。
Macの起動時やユーザーのログイン時にプログラムを自動実行したり、指定した時刻や一定の条件に応じてスクリプトを実行したりできます。
この記事では、launchdとは何か、LaunchAgentやLaunchDaemonとの違い、設定に使われるplistファイル、launchctlとの関係などを解説します。
launchdとは
launchdは、macOSでサービスやプロセスの起動・管理を担うシステムです。
「launch」は「起動する」といった意味を持ち、「d」はUnix系OSでバックグラウンド動作するプロセスを意味する「daemon(デーモン)」に由来します。
一般的には「ローンチディー」と読まれます。
launchdを利用すると、たとえば次のような処理を実現できます。
- Macの起動時にプログラムを起動する
- ユーザーのログイン時にプログラムを実行する
- 指定した時刻にスクリプトを実行する
- 一定間隔で処理を実行する
- 特定の条件に応じてジョブを起動する
- 必要に応じてバックグラウンドサービスを管理する
単なる「自動起動機能」ではなく、macOSにおけるサービス管理の基盤となる仕組みです。
launchdとLaunchAgent・LaunchDaemonの違い
launchdについて調べると、「LaunchAgent」と「LaunchDaemon」という用語も頻繁に登場します。
これらはlaunchdによって管理されるジョブの代表的な分類です。
| 種類 | 主な用途 | 実行範囲 |
|---|---|---|
| LaunchAgent | ユーザー環境で動作する処理 | ユーザー単位 |
| LaunchDaemon | システム側で動作するサービス | システム単位 |
LaunchAgentは、ログインしているユーザーに関連する処理などで利用されます。
一方、LaunchDaemonはユーザーのログインとは独立して動作するシステムサービスなどに利用されます。
つまり、「launchd」と「LaunchDaemon」は同じ意味ではありません。
launchdがジョブを管理する仕組みであり、LaunchDaemonはlaunchdによって管理されるジョブの種類の一つです。
LaunchAgentとは
LaunchAgentは、ユーザーのログインセッションに関連して動作するジョブです。
代表的なplistファイルの配置場所には次のディレクトリがあります。
~/Library/LaunchAgents/
/Library/LaunchAgents/
/System/Library/LaunchAgents/
~/Library/LaunchAgents/は、そのユーザー向けのLaunchAgentを配置する場所です。
/Library/LaunchAgents/は、管理者がインストールしたLaunchAgentなどで使用されます。
/System/Library/LaunchAgents/はmacOSが管理する領域です。通常、ユーザーがここにあるファイルを直接変更するべきではありません。
LaunchDaemonとは
LaunchDaemonは、システムレベルで動作するバックグラウンドサービスなどに利用されます。
代表的な配置場所は次のとおりです。
/Library/LaunchDaemons/
/System/Library/LaunchDaemons/
/Library/LaunchDaemons/には、管理者が導入したサービスなどの設定が置かれます。
/System/Library/LaunchDaemons/にはmacOS自身が利用するLaunchDaemonが配置されています。
LaunchDaemonはユーザーのログインセッションに依存しないシステムサービス向けであり、LaunchAgentとは実行されるコンテキストが異なります。
launchdではplistファイルを使用する
launchdのジョブ設定には、Property List形式の設定ファイルが使用されます。
一般的に拡張子は「.plist」です。
たとえば、ユーザーが独自のLaunchAgentを作成する場合には、次のような場所にplistファイルを配置します。
~/Library/LaunchAgents/com.example.sample.plist
plistには、どのプログラムを実行するのか、いつ起動するのかなどの情報を記述します。
代表的な設定項目には次のようなものがあります。
| キー | 主な役割 |
|---|---|
| Label | ジョブを識別するためのラベル |
| Program | 実行するプログラムを指定 |
| ProgramArguments | プログラムと引数を指定 |
| RunAtLoad | ジョブ読み込み時に実行するかを指定 |
| StartInterval | 一定の秒数間隔で実行 |
| StartCalendarInterval | 日時を条件として実行 |
| KeepAlive | 条件に応じてジョブを継続・再起動 |
| StandardOutPath | 標準出力の出力先 |
| StandardErrorPath | 標準エラー出力の出力先 |
どのキーを利用するかは、実現したい処理によって異なります。
plistファイルの基本例
たとえば、ユーザーがログインしてLaunchAgentが読み込まれた際にスクリプトを実行する場合、概念的には次のようなplistを使用できます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.sample</string>
<key>ProgramArguments</key>
<array>
<string>/Users/username/scripts/sample.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
この例では、「com.example.sample」というラベルを持つジョブを定義し、指定したスクリプトを実行する設定になっています。
実際に使用する場合は、ファイルパスや実行権限などを環境に合わせて設定する必要があります。
launchctlとは
launchdとセットで覚えておきたいのが「launchctl」です。
launchctlは、launchdとやり取りするためのコマンドラインツールです。
ターミナルからlaunchdのジョブを操作したり、状態を確認したりするときに利用します。
たとえば、登録されているジョブの情報を確認する用途などがあります。
launchctl list
ただし、launchctlには複数のサブコマンドがあり、macOSのバージョンや対象となるドメインによって適切な操作方法が異なります。
古い解説ではloadやunloadが紹介されている場合がありますが、現在のlaunchctlではbootstrap、bootout、enable、disable、kickstartなどのサブコマンドを使う方法があります。
そのため、launchctlを実際に使用するときは、使用中のmacOSに対応したマニュアルを確認することが重要です。
launchdとcronの違い
Unix系OSで定期実行というと、「cron」を思い浮かべる人も多いでしょう。
cronは指定した時刻や周期でコマンドを実行するための仕組みです。
一方、launchdは単純な時刻指定だけでなく、macOS上のサービスやジョブを幅広く管理するために利用されています。
| 項目 | launchd | cron |
|---|---|---|
| 主な用途 | サービス・ジョブ管理 | 定期実行 |
| macOSとの統合 | 高い | launchdほど統合されていない |
| 設定 | plist | crontab |
| 条件による起動 | 複数の仕組みを利用可能 | 主に時刻・周期指定 |
| 常駐サービス管理 | 対応 | 主目的ではない |
macOSで新しく自動実行の仕組みを構築する場合には、launchdを理解しておくと便利です。
launchdはどのような場面で使われる?
launchdは、一般ユーザーが意識しないところでもmacOS内部で利用されています。
また、開発者やシステム管理者が独自の自動処理を設定するときにも利用できます。
たとえば、定期的なバックアップ処理、ログファイルの整理、開発用プログラムの起動、ログイン時のスクリプト実行などが考えられます。
ただし、処理内容によってはmacOS標準機能やアプリケーション側の自動起動機能を使ったほうが適切な場合もあります。
launchdを扱うときの注意点
launchdの設定を変更するときは、plistの内容だけでなく、ファイルの配置場所、所有者、アクセス権、実行するファイルの権限などにも注意が必要です。
特にLaunchDaemonはシステムレベルで動作するため、不適切な設定を行うとサービスが正常に起動しなくなる可能性があります。
また、/System/Library/LaunchAgents/や/System/Library/LaunchDaemons/などはmacOS自身が管理する領域です。
システムファイルを安易に変更するのではなく、ユーザー独自のLaunchAgentであれば~/Library/LaunchAgents/、管理者が追加するシステムサービスであれば/Library/LaunchDaemons/など、用途に応じた適切な場所を使用することが重要です。
launchd・launchctl・plistの関係
launchdを理解するときは、3つの要素に分けるとわかりやすくなります。
「launchd」はジョブやサービスを管理する仕組みです。
「plist」は、実行するプログラムや起動条件などを記述する設定ファイルです。
「launchctl」は、launchdに対してジョブの登録や解除、状態確認などを行うためのコマンドラインツールです。
つまり、plistにジョブの設定を記述し、それをlaunchdが管理し、必要に応じてlaunchctlから操作するという関係になります。
まとめ
launchd(ローンチディー)は、macOSでプログラムやバックグラウンドサービスの起動・管理を行う重要な仕組みです。
ユーザー単位で動作するLaunchAgentと、システムレベルで動作するLaunchDaemonがあり、それぞれ用途や実行環境が異なります。
ジョブの設定には主にplistファイルが使われ、launchctlを利用することでlaunchdに対する各種操作や状態確認ができます。
Macで「ログイン時にスクリプトを実行したい」「決まったタイミングで処理を自動化したい」「バックグラウンドサービスを動かしたい」といった場合には、launchdの仕組みを理解しておくと、macOSの自動化やシステム管理に役立ちます。


コメント