Launchd

launchdは、デーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークである。AppleのDave Zarzyckiによって作られ、Mac OS X Tiger (Mac OS X v10.4) で導入された。Apache Licenseのもとで公開されている。

launchdデーモンは基本的に以下を置き換えるものである:
 init
 rc
 init.dスクリプト
 rc.dスクリプト
 SystemStarter (macOS)
 inetd
 xinetd
 atd
 crond
 watchdogd
Appleはlaunchdを推進し、上記のすべてのサービスを廃止するとした。

これらのデーモンが扱っていたほとんどのプロセスが、Mac OS X v10.4でlaunchdに移行された。すべてのlaunch serviceを一つのプログラムに統合することで、launchdは遅いコンピュータでもブート時間を著しく短くする。

コンポーネント
launchdシステムには、launchdとlaunchctlという二つの主なプログラムがある。

launchdはシステムレベルとユーザレベルの両方でデーモンを管理する。xinetdと同様に、launchdはオンデマンドでデーモンを起動できる。またwatchdogdのように、デーモンが確実に動作しつづけているかを監視する。macOSにおいて、launchdはPID 1としてinitのかわりにブート時のシステムの開始を取り扱う。

設定ファイルはlaunchdが実行するサービスのパラメータを定義する。約30の設定可能なキーをもつプロパティリストファイルが、ライブラリフォルダ以下のLaunchAgentsとLaunchDaemonsというサブディレクトリに置かれる。

launchctlはデーモンのロードとアンロード、launchdが管理するジョブの開始と停止、launchdや子プロセスのためのシステム利用統計の取得、環境設定に使用されるコマンドラインアプリケーションである。

launchd
launchdには、システムのブートと、サービスをロードし維持するという二つの主なタスクがある。

PowerPC MacにおけるMac OS X Tigerのシステムの起動の概略を以下に示す。（Intel Macでは、Open FirmwareはEFIに、BootXは boot.efi にそれぞれ置き換えられている）:

Open Firmwareがハードウェアを初期化し、それからBootXをロードする。
BootXがカーネルをロードし、スピンカーソルを表示、すべての必要なカーネル機能拡張をロードする。
カーネルがlaunchdをロードする。
launchdは /etc/rc を実行し、/System/Library/LaunchDaemons と /Library/LaunchDaemons を参照して、必要に応じてplistにもとづいた動作を行い、ログインウインドウを起動する。

ステップ4でlaunchdはジョブを実行するために二つのフォルダを参照する。LaunchDaemonsフォルダには、rootとして実行する（ふつうバックグラウンドの）プロセスの項目がある。LaunchAgentsフォルダには、ユーザかユーザランドのコンテキストで実行される、エージェントアプリケーションと呼ばれるジョブがある。これらはスクリプトかフォアグランド項目かもしれないし、ユーザインタフェースを含めることもできる。これらのディレクトリはすべてmacOSのライブラリフォルダの中に置かれる。

launchdは、ブート時にすべてのデーモンを立ち上げるとはかぎらない点でSystemStarterと非常に異なっている。launchdの重要な考えかたであり、またxinetdと類似している点が、デーモンをオンデマンドで起動するということである。ブート時にジョブplistを参照したとき、launchdはそれらのジョブで要求されたすべてのポートを確保しlistenする。plistに"OnDemand"キーが指定されると、そのときデーモンは実際にはロードされず、launchdがポートをlistenして必要に応じてデーモンを起動したり終了したりする。デーモンがロードされたあと、launchdはその経過を追い、必要なあいだ確実に動作を継続させる。この方式はwatchdogdに似ており、プロセスがかってにforkしたりデーモン化したりしないようにするというwatchdogdの要件と共通している。もしプロセスがバックグラウンドに入ると、launchdは追跡を失い、プロセスの再起動を試みる。

その結果、Mac OS X Tigerはこれまでよりずっと速くブートする。システムはデーモンを実際に立ち上げるのではなく、登録だけすればよい。事実、ブート中にみえるプログレスバーはほんとうに時間の経過以外なにも示さない（WaitingForLoginWindowと名づけられた）見せかけのアプリケーションである。

launchdのブートの中でいちばんの管理の難所は依存関係である。SystemStarterには、起動項目のplistの中に"Uses", "Requires", "Provides" キーを用いたとてもシンプルな依存関係のシステムがあった。Tigerにおいてソフトウェアの立ち上げの依存関係を確立するとき、二つの主なやりかたがある。プロセス間通信を使うと、デーモンどうしのあいだで互いに通信して依存関係を解決することが許容される。あるいは、ファイルやファイルパスの変更を監視することもできる。プロセス間通信を使うことは、SystemStarterのキーよりもはるかにとらえにくいもので開発者により多くの負担をもとめるが、しかしより簡潔で速い起動に結びつくかもしれない。SystemStarterはまだサポートされているオプションだが、Mac OS X Tigerではその重要性は減っており、将来的には利用できなくなるかもしれない。

launchctl
既存のしくみによるサービス制御についての不満の一つは、それらを集中管理するための方法がなく、OS上に散らばっているということである。Appleはlaunchctlでこれに対処した。

launchctlはそれ自身、コマンドラインや、標準入力、対話モードから操作可能なコマンドである。~/.launchd.conf や /etc/launchd.conf に書くことでコマンドを保存できる。スーパーユーザー権限でlaunchctlはシステム全体の変更ができる。

プロパティリスト
プロパティリスト (plist) はAppleがプログラムの設定に用いる形式である。launchdがフォルダを参照したときやlaunchctlを使ってジョブがサブミットされたとき、どのようにプログラムを実行するかが書かれたplistファイルを読む。

よく使われるキーを以下に示す。すべてが載ったリストは、launchd.plistについてのAppleによるマニュアルを参照。

macOS以外での使用
Google Summer of Code Project in 2005の一環としてFreeBSDに移植された。

2006年にUbuntuはlaunchdを使用することを考えていたが、当時はApple Public Source Licenseで公開されていたので「回避不能なライセンス問題」があるとしてこのオプションはリジェクトされた。

2006年8月にAppleは、launchdをほかのオープンソース開発者がより簡単に採用できるようApache License, Version 2.0のもとでライセンスした。

関連項目

 Daemontools
 Runit
 eINIT
 Initng
 Operating System service management
 Super-server
 TCP Wrapper
 Upstart
 Service Management Facility
 systemd

参考文献

外部リンク
 System Startup Programming Topics: Creating launchd Daemons and Agents  at developer.apple.com
 Technical Note TN2083: Daemons and Agents at developer.apple.com
 Getting Started with launchd cache on web.archive.org originally at developer.apple.com
 launchd in Depth from AFP548, published July 08 2005. The basis for much of this article.
 launchd: One Program to Rule Them All – Google Tech talk video presentation by the developer of launchd.
 All About launchd Items (and How To Make One Yourself): The creation of property lists for launchd
 launchd site at macosforge.org contains the official subversion repository for the launchd source.
 launchd's source code at Mac OS Forge (click on "trunk", then "Zip Archive" to get the full source)
 launchd - FreeBSD-Wiki, launchd ported to FreeBSD

MacOS