launchd: macOSのサービス管理フレームワーク
launchdは、macOSで採用されているオープンソースのサービス管理フレームワークです。デーモン、アプリケーション、
プロセス、スクリプトの起動、停止、管理を一元的に行うことができます。
AppleのDave Zarzycki氏によって開発され、Mac OS X Tiger(v10.4)で導入されました。
Apache Licenseの下で公開されており、他のシステムへの移植も可能です。
launchdの役割
launchdは、従来のinit、rc、inetd、atd、crondといった様々なデーモンを置き換えることを目的としています。これらのサービスを一つのプログラムに統合することで、システムの起動時間を大幅に短縮し、リソースの効率的な利用を実現します。
コンポーネント
launchdシステムは、主に`launchd`と`launchctl`という2つのプログラムで構成されています。
launchd: システムレベルとユーザーレベルの両方でデーモンを管理します。必要に応じてデーモンを起動したり、デーモンが正常に動作し続けているかを監視したりします。macOSでは、PID 1としてinitの代わりに
ブート時のシステム開始を担います。
launchctl: デーモンのロードとアンロード、ジョブの開始と停止、システムリソースの使用状況の取得、環境設定などに使用されるコマンドラインアプリケーションです。
設定ファイルは、サービスの設定パラメータを定義するプロパティリスト(plist)ファイルで、`LaunchAgents`と`LaunchDaemons`というディレクトリに保存されています。
launchdの動作
launchdの主なタスクは、システムの起動とサービスのロードと維持です。
1. Open Firmware(
PowerPC Macの場合)がハードウェアを初期化し、BootXをロードします。
2. BootXがカーネルをロードし、必要なカーネル機能拡張をロードします。
3. カーネルがlaunchdをロードします。
4. launchdが`/etc/rc`を実行し、`LaunchDaemons`と`LaunchAgents`ディレクトリ内のplistファイルを読み込み、サービスを起動します。ログインウインドウもここで起動されます。
`LaunchDaemons`にはroot権限で実行されるデーモンが、`LaunchAgents`にはユーザー権限で実行されるエージェントアプリケーションが登録されています。
launchdは、SystemStarterとは異なり、すべてのデーモンを
ブート時に起動するわけではありません。デーモンはオンデマンドで起動され、必要な時にのみリソースを使用します。これにより、システムの起動時間を短縮し、リソースの効率的な利用を実現します。`OnDemand`キーがplistに設定されている場合、デーモンは実際にロードされるのではなく、launchdがポートをリッスンし、必要に応じてデーモンを起動・終了します。
また、デーモンの動作を監視し、必要に応じて再起動することで、システムの安定性を維持します。デーモンがバックグラウンドで実行されている場合、launchdはその追跡を失い、
プロセスを再起動しようとするため、デーモンは勝手にforkやデーモン化をしないように設計する必要があります。
launchctlの利用
launchctlは、コマンドラインからデーモンを管理するためのツールです。標準入力、対話モード、設定ファイルを利用して操作できます。
スーパーユーザー権限で実行することで、システム全体の変更も可能です。
プロパティリスト (plist)
プロパティリストは、プログラムの設定を記述するための
Apple独自の形式です。launchdは、plistファイルに基づいてプログラムの実行方法を決定します。
plistには、以下のようなキーが含まれます。
`Label`: ジョブの一意な識別子
`ProgramArguments`: 実行するプログラムのパスと引数
`RunAtLoad`: システム起動時にジョブをロードするかどうか
`KeepAlive`: ジョブを常に実行し続けるかどうか
* `OnDemand`: ジョブを必要に応じて起動するかどうか
macOS以外での利用
launchdは、2005年に
Google Summer of Codeの一環としてFreeBSDに移植されました。
Ubuntuも一時的に導入を検討しましたが、
ライセンスの問題で断念されました。しかし、2006年に
Apache Licenseで再
ライセンスされたことで、他のオープンソース開発者も採用しやすくなりました。
まとめ
launchdは、macOSの基盤を支える重要なサービス管理フレームワークです。その効率的な動作により、システムの起動時間短縮、リソースの効率的な利用、安定性の向上に貢献しています。また、オープンソースとして公開されていることで、他のシステムへの移植や拡張も可能です。