2011年04月18日

erlシェルからの起動と、-detached指定でデーモン起動したときの動作が違う(デタッチするとサービスが落ちる)

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しててほしいので、この構成は正しいと考えるのが妥当でしょうね。
posted by へろ at 01:39| Comment(0) | TrackBack(0) | Erlang
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/44408001

この記事へのトラックバック