Erlang ejabberd gen_mod开发问题

Erlang ejabberd gen_mod开发问题,erlang,ejabberd,Erlang,Ejabberd,接下来,我实现了mod_测试模块,它实现了gen_mod和gen_服务器行为。现在它是非常愚蠢的,因为它除了加入ejabber_sup之外什么都不做 我的问题是,我不确定模块是否由ejabberd_sup启动,因为我在以下提供的列表中找不到它: supervisor:which_children(ejabberd_sup). 考虑到gen_mod.beam和mod_test.erl在同一个目录中,我使用以下方法编译代码: erlc -pa ./ mod_test.erl 这没有错误。编译后,

接下来,我实现了mod_测试模块,它实现了gen_mod和gen_服务器行为。现在它是非常愚蠢的,因为它除了加入ejabber_sup之外什么都不做

我的问题是,我不确定模块是否由ejabberd_sup启动,因为我在以下提供的列表中找不到它:

supervisor:which_children(ejabberd_sup).
考虑到gen_mod.beam和mod_test.erl在同一个目录中,我使用以下方法编译代码:

erlc -pa ./ mod_test.erl
这没有错误。编译后,我将文件复制到ejabberd安装的ebin文件夹中,并更改了ejabberd.cfg,添加:

....
{mod_test, []},
....
我的代码如下:

-module(mod_test).

-behaviour(gen_server).
-behaviour(gen_mod).

-export([start/2, stop/1]).

-export([start_link/2]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
         terminate/2, code_change/3]).


-record(state, {}).

start(Host, Opts) ->
    Proc = gen_mod:get_module_proc(Host, ?MODULE),
    ChildSpec = {Proc,
                 {?MODULE, start_link, [Host, Opts]},
                 permanent,
                 1000,
                 worker,
                 [?MODULE]},
    supervisor:start_child(ejabberd_sup, ChildSpec).

stop(Host) ->
    Proc = gen_mod:get_module_proc(Host, ?MODULE),
    supervisor:terminate_child(ejabberd_sup, Proc),
    supervisor:delete_child(ejabberd_sup, Proc).

start_link(_Host, _Opts) ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

init([]) ->
    {ok, #state{}}.

handle_call(_Request, _From, State) ->
    Reply = ok,
    {reply, Reply, State}.

handle_cast(_Msg, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.
我的方法有问题吗?如何确保模块正确启动?

我重新安装了ejabberd(vsn 2.1.11),现在它正在工作。 我在这个答案中添加了代码中与questoin中代码不同的部分。更改如下所示

希望这也能帮助其他人。

我重新安装了ejabberd(vsn 2.1.11),现在它可以工作了。 我在这个答案中添加了代码中与questoin中代码不同的部分。更改如下所示


希望这对其他人也有帮助。

只是想一想:可能shell截断了进程列表(在这种情况下,列表将以
结尾)。如果你调用
rp(主管:哪个孩子(ejabberd\u sup))
,你能看到它吗?不,它不在那里……你有其他想法吗?在init中打印PID,这样你就知道要查找什么了。你们使用开始链接——也许家长正在死亡?pid并没有打印出来……但ejabberd_sup还活着,所以我猜mod_测试正在崩溃……但为什么呢?有人能在它的ejabberd中测试它吗?如果你在init()、start_link()和start()中添加一些调试输出,你能看到它们吗?只是一个想法:可能shell截断了进程列表(在这种情况下,列表将以
结尾)。如果你调用
rp(主管:哪个孩子(ejabberd\u sup))
,你能看到它吗?不,它不在那里……你有其他想法吗?在init中打印PID,这样你就知道要查找什么了。你们使用开始链接——也许家长正在死亡?pid并没有打印出来……但ejabberd_sup还活着,所以我猜mod_测试正在崩溃……但为什么呢?有人能在它的ejabberd中测试它吗?如果你在init()中添加一些调试输出,start_link()和start()你看到了吗?
-define(PROCNAME, ejabberd_mod_test).

start_link(Host, Opts) ->
    Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
    gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).

start(Host, Opts) ->
    Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
    ChildSpec =
    {Proc,
     {?MODULE, start_link, [Host, Opts]},
     temporary,
     1000,
     worker,
     [?MODULE]},
    supervisor:start_child(ejabberd_sup, ChildSpec).

stop(Host) ->
    Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
    gen_server:call(Proc, stop),
    supervisor:terminate_child(ejabberd_sup, Proc),
    supervisor:delete_child(ejabberd_sup, Proc).