foreverでSailsをオートリブートするようにしてみる

Node.js上で動作するRails風のWebフレームワーク Sails.jsを試しています。

Sailsはテンプレートエンジンとしてerbのように<% ... %>でJavaScriptコードを埋め込むことのできるejsというテンプレートエンジンを使っており、ビューの変更は即座に反映されるのですが、コントローラなどJavaScriptで記述した部分についてはコードを反映してもNodeを再起動しないと反映されません。

そこで、foreverというプロセスマネージャを使用してファイルの変更を検知すると自動的にNodeのプロセスを再起動するようにしてみます(もちろんforeverはSailsだけでなくNodeアプリケーションであれば同じように使用することができます)。

まずは普通にnpmでforeverをインストールします。

$ npm install -g forever

Sailsをグローバルインストールしている場合、sailsコマンドを使わないとSailsアプリケーションが起動できないので、SailsプロジェクトのルートディレクトリでSailsをローカルインストールします。

$ npm install sails

また、foreverのファイル監視から除外するファイルを指定するために.foreverignoreというファイルを以下の内容で作成します(他にもアプリから作成するファイルやログを出力する場合などは該当のファイルやディレクトリをこのファイルに追加しておきましょう)。このファイルを作成しておかないとファイルの変更時にforeverは無限に再起動を繰り返したり、ビューの変更だけであれば再起動の必要がないのに再起動したりしてしまいます。

**/.tmp/**
**/views/**

ここまで来たら準備完了です。以下のようにしてSailsアプリケーションを起動します。

$ forever -w start app.js

これでJavaScriptコードを編集すると自動的にNodeのプロセスが再起動され、変更が反映されるようになります。

なお、foreverで実行中のプロセスはforever listコマンドで参照することができます。

$ forever list
info:    Forever processes running
data:        uid  command                                 script forever pid   logfile                          uptime
data:    [0] 8D_g /usr/local/Cellar/node/0.10.28/bin/node app.js 15334   15335 /Users/takezoe/.forever/8D_g.log 0:0:0:3.75

プロセスを停止する場合はuidを指定してforever stopコマンドを実行します。

$ forever stop 8D_g

また、forever stopallコマンドですべてのプロセスを終了することもできます。

console.logなどで出力している内容やエラー時のスタックトレースなどを見たい場合はアプリケーションの起動時に-o、-eオプションでアプリケーションの標準出力、エラー出力を出力するファイルを指定することができます。この場合はログファイルを.foreverignoreに追加しておくことをわすれずに。

$ forever -w -o logs/stdout.log -e logs/error.log start app.js

ちなみに以下のように-wオプションをつけずに起動するとファイルの監視を行わなくなります。運用時にアプリケーションが不慮の事故で死んでしまった場合に自動で立ち上げ直すために使用することができます。

$ forever start app.js --prod

試しにkillしてみたのですが、ゾンビのように復活してきます。

最近だとコア数に応じたクラスタリングモニタリングなども可能なpm2のほうが高機能でよさげなのでこちらも試してみたいと思います。