[erlang-questions] starting and cleanly stopping erlang

Serge Aleynikov serge@REDACTED
Tue Jan 16 14:13:28 CET 2007


Joe Armstrong wrote:
> I have written a linked-in driver - that appears to work. Let's assume it
> is started with myLinkedInDriver:start() and stopped with
> myLinkedInDriver:stop()
> 
> I want to do the following.
> 
>    - automatically start the linked-in driver when I start Erlang
>    - automatically stop the linked in driver when I stop Erlang
> 
> I want to stop the linked in driver in a controlled manner. ie I want
> *something* to call
> myLinkedInDriver:stop() and allow me to close the thing down in an orderly
> manner.
 >
> If my linked in driver is not correctly closed down then I'll have to do a
> whole lot of work
> the next time start the system.
> 
> What the minimal amount of junk I have to use to get this behaviour?
> 
> I think I need a minimum of an OTP application + a boot script + some
> command
> line arguments to erl to disable control C handling etc.

1. An OTP application with a gen_server process for your driver

-module(myLinkedInDriver).
-export([ ..., init/1 | OtherGenServerCallbacks ]).

init(Args) ->
     process_flag(trap_exit, true),  % terminate/2 won't be called unless
                                     % you trap exit signals
     case erl_ddll:load_driver(Path, Name) of
     ok ->
         Port = open_port({spawn, ?MODULE}, []),
         % Do other initialization here
         ...
         {ok, State};
     {error, Reason} ->
         {stop, Reason}
     end.
...

terminate(shutdown, State) ->
     % do required clean up here
     ...
     ok.

2. An application module and supervisor module that starts your 
gen_server. (Callbacks for the two can be implemented in the same module).

3. An *.app file listing your application modules
4. A *.rel file needed to generate a boot script
    (use "erlc YourApp.rel" to generate a boot script)
5. If you don't plan to do an embedded system and not interested in 
logging, and release handling, then merely getting an emulator to 
start/stop your app in a controlled manner can be accomplished by:

erl -noshell -detach -pa $YOUR_APP/ebin +Bi -boot $APP_NAME

6. If auto-restart of erl is needed, set the HEART_COMMAND env option, 
and use "-heart" command-line option at startup above.

7. An alternative (advised) way to start a node is by using run_erl 
(that allows to do logging of console output, gives login to the console 
using to_erl, and does log rotation).  See:
http://www.erlang.org/ml-archive/erlang-questions/200506/msg00057.html

and also be careful about using -heart option of erl together with 
run_erl.  Details and patch are here:

http://www.erlang.org/ml-archive/erlang-questions/200601/msg00473.html

8. SysV startup/shutdown script that allows to start/stop the node in a 
controlled manner (i.e. doing shutdown via starting a remote node and 
issuing init:stop() using rpc or else using erl_call utility with an 
'-t' option that requires this patch:
http://www.erlang.org/pipermail/erlang-questions/attachments/20051016/cdc432d5/erl_call.ksh
)

Regards,

Serge

> Does anybody know how do do this?
> 
> /Joe
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions




More information about the erlang-questions mailing list