第2回 initを置き換えるlaunchd【後編】Undocumented Mac OS X(1/3 ページ)

UNIX使いに真のMACPOWERを! 本連載では、UNIX使いに向け、UNIX系OSとしてのMac OS Xを解説していく。前回に引き続き、launchdの設定の詳細のほか、launchdの内部構造について踏み込んでいこう。

» 2007年04月29日 07時00分 公開
[白山貴之,ITmedia]

ServiceIPCとlaunchproxy

 本来、launchdから起動されたプログラムは、launch(3)のAPI(ServiceIPC)*を使用して自身を起動したlaunchdと交信し、どういったイベントで起動されたのか、どういった設定が行われているのかを確認できるようになっている。

 特にネットワークからの接続に関しては、1つのlaunchd.plistで複数ポートを監視するよう設定し、プログラムはlaunch(3)のAPIを用いてどのポートから接続してきたかを識別できるのだ。

 しかし、sshdやnamed、smbdといった一般的なサーバプログラムは、xinetdやinetdからの起動、あるいはスタンドアロンでの起動が前提であり、launch(3) APIを使うようにはできていない。

 この間を埋めるのがlaunchproxyである。launch.plistにinetdCompatibilityキーが存在する場合、launchdはそのサービスを直接起動せず、いったん/usrlibexec/launchproxyというプログラムを起動する。launchproxyは、launch(3)のAPIを用いたサービス情報の取得、launchdに代わりのaccept(2)を利用した接続の確立を行い、標準入出力にソケットをセットした後に実際のサービスを起動する。サービス側から見ると、launchproxyを介することでxinetd/inetdから起動したのと何ら変わらないようにみえる(図1)

図1 図1 ServiceIPCとlaunchproxy

キューと互換性

 ネットワークからの接続や時刻による起動だけではなく、launchdは特定のファイルやディレクトリの更新をチェックするという機能も持つ。これを利用したのがMac OS Xのメールサーバ機能である。Mac OS XはクライアントOSのため通常はメールの送信機能などは不要だが、cronのようなバックグラウンドタスクの中には、/usr/bin/mailを使って処理結果をメールで伝えるものがある。そのためにpostfixが動作するようになっている*のだ。

 リスト1は/System/Library/LaunchDaemonsにあるorg.postfix.master.plistの内容だ。ProgramおよびProgramArgumentsキーで、postfixのmasterを動かす設定がなされているのが分かる。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>org.postfix.master</string>
        <key>Program</key>
        <string>/usr/libexec/postfix/master</string>
        <key>ProgramArguments</key>
        <array>
                <string>master</string>
                <string>-e</string>
                <string>60</string>
        </array>
        <key>QueueDirectories</key>
        <array>
                <string>/var/spool/postfix/maildrop</string>
        </array>
</dict>
</plist>

リスト1 /System/Library/LaunchDaemonsにあるorg.postfix.master.plist

 ポイントはQueueDirectoriesだ。ここでは、QueueDirectoriesの値として/var/spool/postfix/maildropが設定されている。launchdはこのディレクトリを監視し、ファイルが置かれるなど変化があった場合、ProgramArgumentsで指定されたmasterを起動する。masterはキューの内容を確認しpostfixの各プログラムを動作させ、メールの配送処理を行う。masterは引数の「-e 60」によって60秒後に終了し、再びlaunchdから起動されるまで眠りにつく。これによって、普段は不要であるpostfixがメモリやプロセステーブルを占めることもなく、必要なときに必要なだけ効率的に動作する。

このページで出てきた専門用語

launch(3)のAPI(ServiceIPC)

「man launchd.plist」と実行すると「SEE ALSO」に記載はあるのだが、「man 3 launch」としてもマニュアルは表示されない。この詳細は、Darwinのページからlaunchdのソースに含まれるlaunch.hを確認するしかない。

postfixが動作するようになっている

Pantherまではpostfix-watchという専用の監視プログラムが動作しており、このスプールを監視していた。


関連キーワード

UNIX | Mac | Mac OS X | API | BSD


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ