Simpledungeonをスーパバイザ挙動を使って動かす作業中です。
erlシェルからの起動と、-detached指定でデーモン起動したときの動作が違う(デタッチするとサービスが落ちる)という現象に出くわしました。
コマンドラインで
erl -pa /opt/yaws/lib/yaws/ebin
と起動して、erlang shellから
simpledungeon:start().
と入力すると、サービスはちゃんと動く。
でも、同じバイナリで
erl -pa /opt/yaws/lib/yaws/ebin -noinput -noshell -run simpledungeon start -detached &
というふうに、デーモン起動すると、なぜかサービスが動いてないわけです。
いろいろ見て回って、最終的に檜山さんのまとめた"helloちゃんと作るシリーズ"の記述に答えがありました。
http://erlang.g.hatena.ne.jp/m-hiyama/20090114/1231891538
ここ。
要するに、デーモン起動したときだけサービスが動かないというのは、start_linkで起動してるのに親シェルがデタッチしたためにサービスが止まった、ということのようです。
で、檜山さんのスケルトンを参考に、unlinkの1行を追加したところ、Erlangシェルでスーパバイザを起動したときと同じように、サービスが動き続けてくれました。
=======================
修正前:
{ok, Pid} = supervisor:start_link({local,?MODULE},?MODULE,[]),
=======================
修正後:
{ok, Pid} = supervisor:start_link({local,?MODULE},?MODULE,[]),
unlink(Pid),
=======================
うー、つかれた。
start_linkしてunlinkするんだったら、素直に「start」させてくれよ、という気もしますが、そこはOTPの長年の熟成の中で入ってないわけですから、ひとまずこの作法に従うことにします。まあ、unlinkがいるのは、シェルから起動するアプリケーション最上位のsupervisorだけ、それ以外は全部linkしててほしいので、この構成は正しいと考えるのが妥当でしょうね。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/44408001
この記事へのトラックバック
http://blog.sakura.ne.jp/tb/44408001
この記事へのトラックバック