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と名づけられたDaring Fireball: Tiger Details）見せかけのアプリケーションである。

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によるマニュアルを参照。Mac OS X Manual Page For launchd.plist(5)

 キー 説明 必須かどうか Label ジョブの名称。慣習により、ジョブの名称は.plist拡張子を除いたplistのファイル名とおなじ。 必須。 Program 実行ファイルへのパス。シンプルな起動に役立つ。 ProgramかProgramArgumentsのどちらか一つが必須。 ProgramArguments unixコマンドを表した文字列。はじめの文字列はふつう実行ファイルへのパスで、あとの文字列はオプションやパラメータを含む。 UserName ここで与えられたユーザでジョブを実行する。必ずしもそれをlaunchdにサブミットしたユーザでなくてもよい。 オプション。デフォルトではrootかカレントユーザ。 OnDemand 10.5では非推奨。ジョブを持続的に実行するかどうかを定義するブーリアンフラグ。 オプション。デフォルトではtrue。 RunAtLoad launchdにジョブがロードされたときすぐにタスクを起動するかどうかを定義するブーリアンフラグ。 オプション。デフォルトではfalse。 StartOnMount 新しいファイルシステムがマウントされたときにタスクを起動するかどうかを定義するブーリアンフラグ。  QueueDirectories 新しいファイルがないかディレクトリを監視する。開始するにはディレクトリは空でなければならない。また、QueueDirectoriesがふたたびタスクを起動するまえに空の状態にもどさなければならない。 オプション。 WatchPaths 変更がないかファイルかフォルダのパスを監視する。 StartInterval ジョブをくり返して実行するスケジュールにする。実行のあいだのウェイト秒数として指定される。 StartCalendarInterval ジョブスケジューリング。構文はcronと同様。 RootDirectory ジョブを実行するまえにこのディレクトリにchrootする。 WorkingDirectory ジョブを実行するまえにこのディレクトリにchdirする。 StandardInPath, StandardOutPath, StandardErrorPath 立ち上げたプロセスのための入出力ファイルを定義するキー。 LowPriorityIO ファイルシステムI/Oをするときタスクの優先度が低いことをカーネルにしらせる。 AbandonProcessGroup launchdによって立ち上げられたタスクが起動したサブプロセスを、タスクがおわったときにkillするかどうかを定義するブーリアンフラグ。短いタスクが長いサブタスクを起動するところで役立つが、ゾンビプロセスを生じるかもしれない。 オプション。デフォルトではfalse。

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

Category:MacOS