mongrelをdaemonとして登録する

Macでrailsアプリをサービスとして起動時に自動で起動するようにしたい。今回railsアプリはApacheでなくmongrelで走らせることにしたので、mongrelがMacで自動起動するよう設定してやる必要がある。

launchd

Mac OS XはTiger以降はlaunchdを採用(initではなく)。

launchdは自動で起動されるデーモンなどを以下の2つに用意されたディレクトリに置かれた設定ファイルを読み込む。

前者はシステム標準の設定ファイルの保存場所なので、今回mongrelを自動起動させるための設定ファイルを置くのは後者。

launchdの設定ファイル

<?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>local.mongrel.quaint</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/mongrel_rails</string>
<string>start</string>
<string>-e</string>
<string>production</string>
<string>-p</string>
<string>3000</string>
<string>-P</string>
<string>log/mongrel.3000.pid</string>
<string>-c</string>
<string>/Users/quaint/cms</string>
<string>--user</string>
<string>quaint</string>
<string>--group</string>
<string>staff</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
上記の例では、
local.mongrel.quaint
名前
/usr/bin/mongrel_rails
mongrel_railsが置かれているフルパス
/Users/quaint/cms
ワーキングディレクトリー (この場合はrailsアプリのディレクトリーを指定することになる)
quaint
実行時の権限(ユーザー)
staff
実行時の権限(グループ)

mongrelを起動するplistの登録

上の設定ファイルを/Library/LaunchDaemons/にたとえば『local.mongrel.quaint.plist』という名前でコピーしたあと、 ownerがrootになっていることを確認する。

% sudo cp local.mongrel.quaint.plist /Library/LaunchDaemons
Password:
% ls -l /Library/LaunchDaemons
total 24
-rw-r--r--  1 root  wheel  795 Jun 26 07:27 com.google.keystone.daemon.plist
-rwxr-xr-x@ 1 root  wheel  737 Oct 16 10:57 local.mongrel.quaint.plist*
lrwxr-xr-x  1 root  wheel   74 Sep 30 07:44 org.macports.mysql5.plist@ -> /opt/local/etc/LaunchDaemons/org.macports.mysql5/org.macports.mysql5.plist

ファインダーでコピー(や移動)した場合は、ownerがrootになってないはずなので、chownしておくこと。

登録されたか確認

正しい内容が書かれ、ファイルの置き場所も、ownerも問題なければ、あとは再起動すれば起動するはずであるが、 うまくいかなかったときに、原因を探すのにログをみたりしなければいけないのがめんどくさいし、 もう1回起動してみるにも『Already loaded』となって起動できなくてめんどうなので、 再起動する前に、あらかじめlaunchdのフロントエンドであるlaunchctlコマンドを利用してサービスを起動してみて、エラーがでないことを確認しておく。

% sudo launchctl load -w /Library/LaunchDaemons/local.mongrel.quaint.plist
% ps aux | grep mongrel
void        61   0.3  1.6  2464848  33352   ??  Ss   11:14AM   0:02.43 /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /usr/bin/mongrel_rails start -e production -p 3000 -P log/mongrel.3000.pid -c /Users/void/cms --user void --group staff
void       273   0.0  0.0  2435036    528 s000  S+   11:19AM   0:00.00 grep mongrel

return