plistを使ってforeverをデーモン化(OSX)

個人的な使い方として、foreverMac上で使って永続化する事は(必要な時だけ起動するので)今のところそれほど無いのですが、使う事もあるかと調べてみました。

forever自体が起動・停止・一覧表示機能を持っているので、launchctlから扱う利点は、OS起動直後の起動や、ファイル・ディレクトリ監視での起動などでしょうか。(画像を特定ディレクトリに放り込んだら起動して、ファイル形式の変換や、エフェクトかけたりとかができるかも知れません)

という事で、始めます。
まずいくつか用意する情報があります。

  • nodeのパス
  • foreverのパス
  • 実行スクリプトのパス
  • 管理の際の名称

上の3つはwhichあたりで取得すればOKですね。
最後の1つは、サービスを一意に識別するための情報で、Androidアプリなどにも使われています。主に、以下のような形式になるようです。

jp.example.アプリ名

実際にlaunchctl listしてみると、

  • com.apple.fontd
  • com.oracle.java.Java-Updater

などとなっているのが分かると思います。

ここでは画像チャットを想定して、jp.zebevogue.imageChatとしました。

jp.zebevogue.imageChat.plist

名前が決まったところで、サンプルです。

<?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>Disabled</key>
	<false/>
	<key>KeepAlive</key>
	<dict>
		<key>SuccessfulExit</key>
		<false/>
	</dict>
	<key>Label</key>
	<string>jp.zebevogue.imageChat</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/zebevogue/.nvm/v0.10.15/bin/node</string>
		<string>/Users/zebevogue/.nvm/v0.10.15/bin/forever</string>
		<string>-a</string>
		<string>-l</string>
		<string>/Users/zebevogue/Sites/node-samples.new/image_chat_socket.io/app.log</string>
		<string>-e</string>
		<string>/Users/zebevogue/Sites/node-samples.new/image_chat_socket.io/app_error.log</string>
		<string>/Users/zebevogue/Sites/node-samples.new/image_chat_socket.io/index.js</string>
	</array>
	<key>RunAtLoad</key>
	<false/>
	<key>StartInterval</key>
	<integer>3600</integer>
</dict>
</plist>

foreverの各オプションについてはforever --helpしてください。

このファイルを~/Library/LaunchAgentsにコピーし、以下のコマンドでロードします。

launchctl load ~/Library/LaunchAgents/jp.zebevogue.imageChat.plist

上手く動かない場合、実際に上記のProgramArgumentsの文字列を実行してみてエラーがないか確認してみてください。

サービスの管理は以下のツールが便利かと思います。
Macで動いているサービス・デーモンを管理するソフトウェア2つ - ZeBeVogue別館