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については下記の書籍が詳しいです。
今回の作業は、要するに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/~は、MacPortsでRubyを入れており、そのまま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は制御とか一切考えてませんのであしからずご了承下さい。