restarting child processes

Chris Campbell <>
Wed Oct 19 23:00:12 CEST 2005


Hi,

I'm playing with the supervisor behaviour but for some reason it
always terminates after a problem with the child.  The program is a
little contrieved to learn about the behaviour.  The child is to
terminate if it doesn't receive a message within 750ms.  The
supervisor should restart it indefinitely, instead it terminates.


Here is the child module.

% swf_kid.erl
-module(swf_kid).
-export([start_child/0, child_work/0, stop_child/1]).


start_child() ->
    child_work().

child_work() ->
    receive
        stop ->
            io:format("stopping!~n"),
            ok;
        Others ->
            child_work()
    after 750 ->
            io:format("child exiting~n"),
            exit(blah)
    end.

stop_child(C) ->
    C ! stop.

and here is the supervisor.

% swf_supervisor.erl
-module(swf_supervisor).
-behaviour(supervisor).
-export([start_link/0, init/1]).


start_link() ->
    supervisor:start_link(swf_supervisor, []).

init(_X) ->
    {ok, {{one_for_one, 50, 1},
          [{kid, {swf_kid, start_child, []},
            permanent, brutal_kill, worker, []}]}}.

This gives the following error (with sasl)...

> swf_supervisor:start_link().
child exiting

=SUPERVISOR REPORT==== 19-Oct-2005::21:52:53 ===
     Supervisor: {<0.256.0>,swf_supervisor}
     Context:    start_error
     Reason:     {'EXIT',blah}
     Offender:   [{pid,undefined},
                  {name,kid},
                  {mfa,{swf_kid,start_child,[]}},
                  {restart_type,permanent},
                  {shutdown,brutal_kill},
                  {child_type,worker}]

** exited: shutdown **

Why isn't the child being restarted?


Regards,
Chris



More information about the erlang-questions mailing list