直接看启动函数
start(normal, _Args)
%% ejabberd_logger主要是读取application的配置文件,然后启动lager,设置lager参数。
ejabberd_logger:start(),
%% 将本进程的pid写入配置文件指定的文件名中
write_pid_file(),
%% 新建jid ets
jid:start(),
%% 启动其它 app
start_apps(),
%% 查检ejabberd需要的module是否都有,如果没有,退出
ejabberd:check_app(ejabberd),
%% 空函数什么都没干
randoms:start(),
%% 启动mnesia
db_init(),
%% 启动ejabberd进程,进程loop为空
start(),
%% 读取*.msg中的条目,将英文信息与翻译后的信息存入translations的ets中,方便以后查询
translate:start(),
%% 创建两个ets用来存放命令
ejabberd_ctl:init(),
%% 新建ejabberd_commands的ets,然后插入两条命令
ejabberd_commands:init(),
%% 插入命令到ejabberd_commands的ets中
ejabberd_admin:start(),
%% 创建名为ejabberd_modules的ets
gen_mod:start(),
%%加入新的模块文件路径,注册几个查看模块的命令到ejabberd_commands
ext_mod:start(),
%% 读取配置文件,设置进程属性
ejabberd_config:start(),
set_settings_from_config(),
acl:start(),
shaper:start(),
connect_nodes(),
Sup = ejabberd_sup:start_link(),
%% 连接其它结点
ejabberd_rdbms:start(),
ejabberd_riak_sup:start(),
ejabberd_sm:start(),
cyrsasl:start(),
% Profiling %
ejabberd_debug:eprof_start(),
%
ejabberd_debug:fprof_start(),
maybe_add_nameservers(),
ejabberd_auth:start(),
ejabberd_oauth:start(),
gen_mod:start_modules(),
ejabberd_listener:start_listeners(),
?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]), Sup;
%% 初始化数据库
db_init() ->
ejabberd_config:env_binary_to_list(mnesia, dir),
MyNode = node(),
DbNodes = mnesia:system_info(db_nodes),
%% 如果自己这个结点不是数据库结点中的一个报错
case lists:member(MyNode, DbNodes) oftrue -> ok;false -> ?CRITICAL_MSG("Node name mismatch: I'm [~s],
" "the database is owned by ~p", [MyNode, DbNodes]),
?CRITICAL_MSG("Either set ERLANG_NODE in ejabberdctl.cfg " "or change node name in Mnesia", []),
erlang:error(node_name_mismatch) end,
%% 第一个启动的mnesia结点,创建schema
case mnesia:system_info(extra_db_nodes) of[] -> mnesia:create_schema([node()]);_ -> ok end,
%% 启动mnesia
ejabberd:start_app(mnesia, permanent),
mnesia:wait_for_tables(mnesia:system_info(local_tables), infinity).