respawn 機能とかは少しかぶるとこもあるけれど、大きな違いとしては upstart は
start on runlevel [2345] stop on runlevel [!2345]
で書く 2345 が ランレベル を表しているように、システムのイベントに関連付けられるのが強み。あと、Linux で広く用いられているので、他の関連監視ツールとも組み合わせやすい。
foreverについてよくまとめられてるwikiの「サーバー起動時に自動的にforeverを自動開始する」ところでは、rc.local にコマンドを書き込めって書いてあって、このファイルはランレベルに関わらず読み込まれるので確かに適切。
冒頭にあげたプロセスの自動再起動は
- respawnの問題点
- サービスによってはうまく制御できないことがある。
- 停止させることができない。
- daemontools や monitなどサービス監視系のツールをinittabに登録し、自動再起動させたいサービスをその制御下に置くとよい
と initとプロセス再起動 に書かれていて、まあ respawn 書いておいてもいいけれど、基本はもう少しレイヤーが上の仕組みで制御したほうがいい。
つまり、forever も upstart の競合というわけでもなく、 upstart の中に書いておくというのはアリだと思うんだけど、start や stop も機能としてかぶっているんだよね。それぞれで stop したりしたらややこしいので、以下のような方法がある
でも、こうなってくると非常に煩雑!…というわけで、僕は forever で管理しているのは rc.local で立ち上げるようにしていて、起動や終了の設定が元から煩雑なものは upstart に細かく書くようにしています。
ちなみに forever は Node.js だけでなく forever start -c python crawler.py
とかで Python とかも立ち上げられるよ。Python には Supervisorがあるんだけど、どっちかっていうと、高機能・高信頼よりは手軽さを取って、forever です。
ちなみに upstart の expect がよくわかっていない。
stop と daemon と fork があって、ここにヒントが書いてあるけど、見分け方がいまいちわからん。毎回実験してなんとかしてる。
その他参考:
- Node.js upstart vs forever - Stack Overflow 違い。
- Windowsユーザーに教えるLinuxの常識(10):Linux起動の仕組みを理解しよう[init/inittab編] (1/2) - @IT rcスクリプトの実行を司ってる元スクリプトについて(Ubuntuの場合は、/etc/inittabは存在しない →参考: Sysvinit - なんなんなん行く?
- [ThinkIT] 第4回:システム起動スクリプトとランレベルの比較 (1/3)