OTP スーパーバイザーに、(最終的に) リモート サーバーに接続する子ワーカーを開始させようとしています。Rebar を使用してテンプレート テスト アプリケーションを作成し、スーパーバイザーにモジュール 'foo' の関数 'hi' を起動させようとしています。それは正常にコンパイルされ、実行されます:
Eshell V5.8.5 (abort with ^G)
1> test_app:start(1,1).
{ok,<0.34.0>}
しかし、ワーカーを起動しようとすると、このエラーで洋ナシの形になります:
2> test_sup:start_foo().
{error,{badarg,{foo,{foo,start_link,[]},
permanent,5000,worker,
[foo]}}}
この問題は、次の質問と似ていますが、同じではないようです: Erlang - Starting a child from Supervisor Module
何か案は?
test_app.erl
-module(test_app).
-behaviour(application).net
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
test_sup:start_link().
stop(_State) ->
ok.
Test_sup.erl:
-module(test_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1, start_foo/0]).
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
{ok, { {one_for_one, 5, 10}, []} }.
start_foo()->
supervisor:check_childspecs(?CHILD(foo, worker)),
supervisor:start_child(?MODULE, ?CHILD(foo, permanent)).
foo.erl:
-module(foo).
-export([hi/0]).
hi()->
io:format("worker ~n").