Supervising an ordinary process in Erlang/OTP supervisor behaviour

As far as I understand, a supervisor process can supervise a number of processes in Erlang/OTP behavioral model.

That processes can be gen_server , gen_fsm, and gen_event . My question is that can an ordinary process become supervised by a supervisor process in Erlang/OTP? By ordinary process I mean a process that is not gen_server , gen_fsm , or gen_event .

If so, how process specification will look like? I tried below but does not work:

Spec = {Id, {my_module, my_function, [Par1, ..., ParN]}, permanent, 5000, worker, [my_module]}

I also tried this:

Spec = {Id, {my_module, my_function, [Par1, ..., ParN]}, permanent, 5000, worker, []}

But when I replace the module and function with a gen_server module and a function from inside it, this works well.

Can I conclude that a child process for a supervisor can not be an ordinary process?

Error that I get is:

Error is follow: application: myapp exited: {bad_return, {{myapp_app,start,[normal,[]]}, {'EXIT', {{badmatch, {error, {shutdown, {failed_to_start_child,worker_1, {ok,state}}}}}, [{myapp_app,start,2, [{file,"src/myapp_app.erl"},{line,27}]}, {application_master,start_it_old,4, [{file,"application_master.erl"},{line,272}]}]}}}}


The most likely reason, without seeing your source, that this is failing is that ordinary spawn calls return just a pid, as opposed to OTP start_link calls which return {ok, Pid} , and this is what the supervisor expects.

As for whether or not an ordinary process can be supervised...

Short answer: Yes, but you should start it with proc_lib.

Long answer: Yes, but you should start it with proc_lib, and a few other things wouldn't hurt. Basically, your process should be OTP-compliant if you intend for it to work in an OTP supervision tree. Please refer to the OTP Design Principles for special/custom processes, as suggested by legoscia in the comments to your question.

If you supervise a process that is not started with proc_lib, you lose certain "guarantees" (for lack of a better term) that supervisors give you. For instance, a supervisor will not start the second process in its process list until the first one has completed its init function (in the case of gen_server/fsm/event). This "guarantee" is lost with generic spawn calls.

链接地址: http://www.djcxy.com/p/38204.html

上一篇: Erlang上的牛仔在关机时崩溃

下一篇: 监督Erlang / OTP主管行为中的普通进程