MacOSX(10.5) launchd

Mac miniでサーバをしようと内部を分解したりしていましたが、最近は様々なサーバ系ソフトのインストールに追われています。世の中便利なパッケージがあるようですが、やはりトラブルの際には色々とわかっていたほうがよいと思うので、『漢は黙ってソースからインストール』(笑)を選択しています。現在のところ、プロキシ(squid-cache)データベース(PostgreSQL)のインストールが完了しました。その過程で、MacOSXの起動時の挙動がかなり変更されていてサービスを自動起動するのに戸惑ったので、そのことを記事にしたいと思います。

長くなりそうなので、メインページから来られた方は続きをどうぞ。

現時点でこのサイトを提供しているサーバのG3 Macでは、MacOSX 10.3(Panther)がOSとして稼働しています。10.3ではサーバ系のサービスを自動起動する際はSystemStarterというサービスに依存しており、/System/Library/StartupItems等の中にソフト毎にディレクトリを掘って、起動スクリプトや実行順番の設定(*.plistというファイル)などを入れておく、という作法がありました。場合によっては/etc/hostconfigという、どのサービスを起動するかしないかが書かれたファイルも編集する必要がありました。SystemStarterはそれなりによくできていて、自動起動以外にもSystemStarter [start|stop|restart] (サービス)などとすると、対応するサービスの起動スクリプトが呼び出されて、記述したとおりのコマンドが実行されていました。

新しいMac miniでは10.5(Leopard)が稼働しています。Mac miniを購入したままの状態だと10.4(Tiger)が入っているようですが、10.5のDVDディスクが同梱されていたので、早速開封直後に10.5に入れ替えました。
今回問題となっている起動時の挙動については、Appleの『Getting Started with launchd』によると10.4を境に変更されたようで、10.4以降はlaunchdというデーモンが全てを取り仕切っているようです。10.3以前のSystemStarterは後方互換性の為、廃止はされていないものの、このlaunchdに置き換えることが推奨されています。更にはこの文章によると、*NIXではメジャーなデーモンの自動起動方法である/etc/rcやinit.d、そしてなんと指定時刻にコマンドを実行するcronまで、launchdへ移行することが推奨されているようです。
launchdを利用した自動起動を実現するには、SystemStarterに似ていて、/System/Library/LaunchDaemons等にスクリプトを置けばよいようです。しかしながら形式がXMLになりました。SystemStarterの頃はXMLでなかったので、何となく他のスクリプトをまねて直感的に書けば動いてしまっていたのですが、XMLとなるとキーや値に対して制限がありバリデーションが検証される可能性があるので、まじめに書く必要があるかと思います。そこでこのスクリプトについて書き方の詳しい解説を探してみましたが、とりあえずの情報源としてはman 5 launchd.plistしか発見できませんでした。その情報を下にこれまでインストールしたsquid-cacheとpostgresqlの自動起動ファイルをさらしておこうと思います。

/System/Library/LuanchDaemons/org.squid-cache.plist

<?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.squid-cache</string>
    <key>Program</key>
    <string>/usr/local/squid/sbin/squid</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

/System/Library/LuanchDaemons/org.postgresql.plist

<?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>GroupName</key>
    <string>postgres</string>
    <key>Label</key>
    <string>PostgreSQL</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/pgsql/bin/postgres</string>
        <string>-D</string>
        <string>/usr/local/pgsql/data</string>
    </array>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/usr/local/pgsql/log/logfile.err</string>
    <key>StandardOutPath</key>
    <string>/usr/local/pgsql/log/logfile.log</string>
    <key>UserName</key>
    <string>(postgresql専用のユーザ)</string>
</dict>
</plist>

とりあえず上記のスクリプトでsquid、postgrsqlともに自動起動、動作をしているようです。不思議なのがSystemStarterにはあった停止時、再起動時の挙動の指定方法について、man 5 launchd.plistでは書かれていないことが気になっています。

10.3から10.5にOSを変えてみると、launchd以外にもユーザの管理方法が変更(NetInfoが廃止)など大きな変更があるようで、軽く浦島太郎状態なのですが、今後も負けずに10.5を探訪していこうと思います。

February 01, 2008 15:34 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする