Macでのサービス制御
以前,DNSサーバでもちょこっと触れたけど,Mac OS X Leopard(10.5)のサービス制御はlaunchdなるものを使っている。あのあとPostgreSQLやSubversionを入れたのでこいつらのデーモンをOS起動と同時に動くよう設定することにした。
サービス制御を行う場合,/Library/LaunchDaemons/ ディレクトリ以下にサービス制御を行うXMLファイルを書いてlaunchdに読み込ませればよい(OSが標準で定義するものは /System/Library/LaunchDaemons/ となるがこちらは原則変えない)。
OSが標準で定義するXMLを参考に,手元のPostgreSQLの場合,次のようにした。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>GroupName</key>
<string>pgsql</string>
<key>Label</key>
<string>jp.shiden.PostgreSQL</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/pgsql/bin/postgres</string>
<string>-D</string>
<string>/service/database</string>
<string>-i</string>
</array>
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>StandardOutPath</key>
<string>/dev/null</string>
<key>UserName</key>
<string>pgsql</string>
</dict>
</plist>
この定義の場合,意味はおおむね次のかんじ。
- サービス名称を"jp.shiden.PostgreSQL" とする(これは一意であればよいのでテキトー)
- 起動ユーザ,グループを pgsql:pgsql とする
- コマンドを "/usr/local/pgsql/bin/postgres -D /Users/pgsql/database -i" とする
- 標準出力,エラーをいずれも /dev/null とする
- launchctlでのロード時に起動までおこなう
ちなみに,この設定ファイルを書くに当たってはまったのは次の2点。
- pg_ctlで起動した場合,処理終了後pg_ctlプロセス自体はlaunchctlでエラーになってしまう
(だからpostgresで起動するようにした) - OnDemandをfalseにしないと,自動起動しない
(必要に応じてlaunchctl start ... で起動するという意味になってしまうから)
とまぁ,試行錯誤(結構時間食った)を経て,無事必要なサービスが自動起動するようになりましたとさ。これでちょっとは使い勝手がよくなったかな。

コメントする