OS X Tigerでgem_serverをサービス化して常駐する

Ruby on Railsで開発してる方なら、APIドキュメントを見るのにgem_serverを起動していることが多いかと思います。
今日、id:xibbarさんから、gem_serverについて聞かれて、いちいちgem_serverと打って立ち上げるのは面倒だよねと言われて、確かにそうだよなあと。
で、それならgem_serverをサービス化しちゃって常駐させちゃおうと考えました。そんなわけで早速launchdの設定ファイルを書いてAgentにしてみました。
あ、忘れてましたがOS Xの話です(^_^;)
具体的な作業を書く前に、ここでlaunchdについて簡単に。launchdは、UNIXでいえばinitにあたり、プラスinetd/xinetdさらにはcronの役割も果たします。Launchdについては下記の書籍が詳しいです。
Professional Mac OS X (SOFTBANK MOOK)

今回の作業は、要するにLinux等で言えば、daemon化したと言う訳です。
で、具体的な作業ですが、所定の場所にlaunchdの設定ファイル、launchd.plistと呼ばれるXMLファイルを置くだけです。
まずは、設定ファイルの置き場所を確認します。~/Library/LaunchAgents/があるか確認しましょう。なければ作成しておきます。
ここによると、propertyList is NULL とかのエラーが出るときがあるので、Property List Editor.app で作るのが確実とのことですので、素直に従いましょう。
Property List Editor.appは、/Developer/Applications/Utilities/ にあります。
起動して、まずはNew Rootをクリック。Property ListのRootを開き、New Childをクリックします。
Property ListにLabelと入力し、ClassはStringのままで、Valueにはorg.rubygems.gem_serverなどと入力します。ここで入力したValueはファイル名になります。
New Siblingをクリックし、Property ListにOnDemandと入力し、ClassはBooleanに、ValueはNoを選択します。New Siblingをクリックし、Property ListにProgramArgumentsと入力し、ClassはArrayを選択します。
今作ったProgramArgumentsを開き、New Childをクリックします。ClassはStringのままで、Valueに/opt/local/bin/gem_serverと入力します。なお、/opt/local/~は、MacPortsRubyを入れており、そのままrubygemsを導入した場合のパスですので、別の場所にある場合は適宜置き換えて下さい。
ここまで入力したら、後はLabelに入力したValue名.plist(上記の場合org.rubygems.gem_server.plist)で最初に作成しておいた~/Libraly/LaunchdAgents/に保存します。

ちなみに中身はこんなxmlファイルになってます。Property List Editor.appでの作業が面倒な方はこれをコピーしても。

<?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.rubygems.gem_server</string>
	<key>OnDemand</key>
	<false/>
	<key>ProgramArguments</key>
	<array>
		<string>/opt/local/bin/gem_server</string>
	</array>
</dict>
</plist>

後は、ログアウトして、再ログインすれば、launchd経由でgem_serverが起動しているはずです。
ちなみに~/Library/LaunchdAgents/に置いたlaunchd.plistは、ユーザログイン時に、ユーザ権限で起動されるlaunchdから立ち上がっていますので、システム全体でDaemon化したい場合は所定の別の場所に起き、root権限などを追加記述する必要があります。
それから、このlaunchd.plistは制御とか一切考えてませんのであしからずご了承下さい。