連載
» 2007年04月29日 07時00分 公開

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

[白山貴之,ITmedia]

そのほかの使い道

 また、このQueueDirectoriesは、postfixのスプールのような本来の利用法以外にも使い道はある。リスト2は同じくシステムドメインに配置されているcom.vix.cron.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>com.vix.cron</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/sbin/cron</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>WatchPaths</key>
        <array>
                <string>/etc/crontab</string>
        </array>
        <key>QueueDirectories</key>
        <array>
                <string>/var/cron/tabs</string>
        </array>
</dict>
</plist>

リスト2 /System/Library/LaunchDaemonscom.vix.cron.plist

 このリスト2では、WatchPathsで/etc/crontabを、QueueDirectoriesで/var/cron/tabsディレクトリを監視するように指定されている。Tigerのインストール直後/etc/crontabには何の設定もされておらず*、/var/cron/tabsも空になっている。しかし、crontabファイルを編集したりcrontab(1)コマンドで/var/cron/tabs以下にユーザーごとのcrontabが登録されると、launchdはcronを起動し、それらの処理を任せる。こうすることで、従来からのUNIXユーザーや開発者がcrontabを使ったソフトウェアを使用しても何ら問題ないようにできている。xinetdについても同じような設定がなされており、/etc/xinetd.d/に設定ファイルを追加するだけで自動的にxinetdが起動するようになっている。

 QueueDirectoriesを活用することで、launchdはこうした過去との互換性も維持しているのだ。

serviceコマンド

 互換性が確保されているのは、QueueDirectoriesだけではない。/sbin/serviceというコマンドもそれに当たる。Mac OS Xの/sbin/serviceコマンドは、Linuxの/sbin/serviceと/sbin/chkconfigを足して2で割ったようなもので、バックグラウンドで動作するサービスの起動や終了を指示したり、サービスの一覧を表示するなどの機能を持つ。このコマンドの実態はシェルスクリプトで、xinetdの設定とLaunchDaemonsディレクトリの双方をチェックし、指定の動作を行う。Linuxから移行してきたユーザーにとっては、このコマンドはlaunchctlのようなコマンドよりも扱いやすいだろう。

launchctlコマンド

 launchctlは、launchdのフロントエンドとなるコマンドである。使い方は2つあり、その1つは引数なしにlaunchdを実行することだ。そうすると、「launch%」というプロンプトが表示される。ここで、表1にあるサブコマンドを入力すると、各種機能を対話的に操作できる。もう1つの利用法は、launchctlに続けてサブコマンドおよびその引数を指定し非対話的な操作を行うことだ(リスト3)

表1 表1 Serviceコマコマンドのサブコマンド

if [ -f /Library/Preferences/com.apple.sharing.firewall.plist ]; then
          /usr/libexec/FirewallTool
fi
# Load [ideally on demand] daemons
/usr/libexec/register_mach_bootstrap_servers /etc/mach_init.d
if [ "${SafeBoot}" = "-x" ]; then
         launchctl load /System/Library/LaunchDaemons
else
         launchctl load /Library/LaunchDaemons /System/Library/LaunchDaemon
         SystemStarter ${VerboseFlag}
fi

/usr/sbin/update
リスト3 launchctlに続けてサブコマンドやその引数を指定し、非対称的な操作を行うこともできる

 なお、launchctlが接続するのは、実行したユーザーと同じuidで動作するlaunchdだ。つまり、PID 1のlaunchdと接続するには、root権限でlaunchctlを実行させなければならない。

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

Tigerのインストール直後/etc/crontabには何の設定もされておらず

アップグレードインストールをした場合場合はこの限りではない。


関連キーワード

UNIX | Mac | Mac OS X | API | BSD


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ