[erlang-questions] How to force kernel application will always be started before my app
Sergey A.
n39052@REDACTED
Sun Nov 23 18:33:07 CET 2008
Hello.
I've a tricky problem with starting my OTP application from escript interface.
Here is what I do in escript to start my app:
First I start a node for my application:
RunNode = "erl -detached -sname foo@REDACTED -setcookie my_cookie
-boot start_sasl -config log -pa /path/to/ebin",
os:cmd(RunNode)
Then my script waits until the node is actually started:
wait_for(pong, foo@REDACTED),
after that I do rpc:call to start my application and check if there
was an error (that is why I don't use "erl -s foo start". I need to
know in my escript whether app was started or not):
case rpc:call(foo@REDACTED, foo, start, []) of
ok -> ok;
{error, Reason} ->
erlang:error(internal_foo_error)
end
But at some computers such a rpc:call fails with {error,
{not_started,kernel}} return value. This happens because kernel
application doesn't have enough time between os:cmd and rpc:call calls
to start.
What I should do to avoid this error in a right manner?
I think that using of timer:sleep(300) isn't the right way.
I could use somethin like
[rpc:call(foo@REDACTED, application, start, [App]) || App <- [kernel, sasl]]
in escript before starting my application, but it looks like a hack
(or not?). I beleive there should be the standard way to ensure that
all the dependencies of my app were already started.
It's my foo.app:
{application, foo,
[{description, "Foo"},
{vsn, "1.0"},
{modules, [<skipped>]},
{registered, [foo_storage, foo_sup, foo_web]},
{applications, [kernel, stdlib, sasl]},
{mod, {gin_app, []}}
]}.
Thanks.
--
Sergey.
More information about the erlang-questions
mailing list