Module 如何获取加载的ejabberd模块列表?

Module 如何获取加载的ejabberd模块列表?,module,erlang,ejabberd,Module,Erlang,Ejabberd,我正在编写一个ejabberd模块,在以下两种情况下,需要对stop执行不同的清理操作: 当前,同一模块正在其他群集节点上运行 这是我的模块最后一个仍在运行的实例 我考虑以下解决方案: is_there_running_instances() -> {Results, _} = rpc:multicall(nodes(), ?MODULE, ejabberd_loaded_modules, []), lists:member(?MODULE, lists:append(

我正在编写一个ejabberd模块,在以下两种情况下,需要对stop执行不同的清理操作:

  • 当前,同一模块正在其他群集节点上运行
  • 这是我的模块最后一个仍在运行的实例

我考虑以下解决方案:

is_there_running_instances() ->
    {Results, _} = rpc:multicall(nodes(), ?MODULE, ejabberd_loaded_modules, []),
    lists:member(?MODULE, lists:append(Results)).

ejabberd_loaded_modules() -> ???.

但我不知道如何获取已加载模块的列表。我怎么做?还是我的问题有更好的解决方案?

code:all\u loaded/0
返回类型为
{ModuleName,ModuleAbsolutePath}
的元组列表,其中ModuleName是原子,ModuleAbsolutePath是字符串。 您可以使用路径信息筛选此列表,并将其解压缩以仅获取其包含的模块。加载所有模块后,我使用eunit库对其进行测试:

26> Filter = fun(Path,Lib) -> string:str(Path,Lib) > 0 end.                         
#Fun<erl_eval.12.80484245>
27> [Mod || {Mod,Path} <- code:all_loaded() , is_list(Path), Filter(Path,"eunit")].
[eunit,eunit_proc,eunit_test,eunit_data,eunit_surefire,
 eunit_serial,eunit_tests,eunit_autoexport,eunit_tty,
 eunit_server,eunit_striptests,eunit_lib,eunit_listener]
26>Filter=fun(Path,Lib)->string:str(Path,Lib)>0结束。
#乐趣
27>[Mod |{Mod,Path}如果需要,请尝试

gen_mod:loaded_modules(Host)

是您需要的

首先获取所有已加载模块列表,其中包含代码:all\u loaded/0,然后使用“mod\u”preffix筛选结果

您还可以执行行为检查。它应该是gen_mod

is_gen_mod(Module) ->
    BehavioursList = 
    case lists:getkey(1, behaviour, Module:module_info(attributes)) of
        {behaviour, L} -> L;
        false -> []
    end,
    lists:member(gen_mod, BehavioursList).
在这种情况下,ejabberd_加载的_模块/0功能将为:

ejabberd_loaded_modules() ->
    ...
    ModPreffixed = lists:filter(Filter, AllLoaded),
    lists:filter(fun is_gen_mod/1, ModPreffixed).
ejabberd_loaded_modules() ->
    ...
    ModPreffixed = lists:filter(Filter, AllLoaded),
    lists:filter(fun is_gen_mod/1, ModPreffixed).