ejabberd.app.src
{application, ejabberd, [{description, "ejabberd"}, {vsn, "15.11.55"}, {modules, []}, {registered, []}, {applications, [kernel, stdlib]}, {env, []}, {mod, {ejabberd_app, []}}]}.
则可以看到启动ejabberd_app模块的start/2方法
ejabberd_app.erl
start(normal, _Args) -> ejabberd_logger:start(), write_pid_file(), jid:start(), start_apps(), ejabberd:check_app(ejabberd), randoms:start(), db_init(), start(), translate:start(), ejabberd_ctl:init(), ejabberd_commands:init(), ejabberd_admin:start(), gen_mod:start(), 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(), start_modules(), ejabberd_listener:start_listeners(), ?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]), Sup;
则可以看到调用一系列的方法和函数:
ejabberd_logger:start() //加载sasl、lager,设置sasl、lager的环境变量,并启动lager
write_pid_file() //当前的pid写入pid文件
jid:start() //创建jid的ets表
start_apps() //启动各个模块
start_apps() ->
crypto:start(),
ejabberd:start_app(sasl),
ejabberd:start_app(ssl),
ejabberd:start_app(p1_yaml),
ejabberd:start_app(p1_tls),
ejabberd:start_app(p1_xml),
ejabberd:start_app(p1_stringprep),
ejabberd:start_app(p1_zlib),
ejabberd:start_app(p1_cache_tab).
ejabberd:check_app(ejabberd) //检测ejabberd模块的位置路径
randoms:start() //注册一个名为random_generator,用当前时间做种子生成随机字符串的进程
db_init() //初始化并启动本地的mnesia数据库,并等待直到所有表可用或超时
start() //开启一个进程注册自己为ejabberd,并一直空loop()
translate:start() //创建translations表(ets),并加载语言文件到translations(国际化)
ejabberd_ctl:init() //创建两张表ejabberd_ctl_cmds(ets),ejabberd_ctl_host_cmds(ets)
ejabberd_commands:init() //创建ejabberd_commands(ets)
ejabberd_admin:start() //添加ejabberd_admin里面的commands到ejabberd_commands
gen_mod:start() //创建ejabberd_modules表(ets)
ext_mod:start() //启动inets模块, 添加ext_mod里面的commands到ejabberd_commands
ejabberd_config:start() //创建local_config表(mnesia),并加载配置文件
set_settings_from_config() //设置日志级别,默认为4 开启net_kernel:set_net_ticktime
acl:start() //访问控制 ,创建表acl(mnesia)、access(mnesia),并根据配置文件添加ACLs,AccessRules内容
shaper:start() //创建表shaper(mnesia),并根据配置文件添加内容
connect_nodes() //创建节点间的链接 net_kernel:connect_node
Sup = ejabberd_sup:start_link() //启动一个supervisor,并启动和监控定义的子进程 {ok, {{one_for_one, 10, 1}, [Hooks, NodeGroups, SystemMonitor, Router, Router_multicast, S2S, Local, Captcha, ReceiverSupervisor, S2SInSupervisor, S2SOutSupervisor, ServiceSupervisor, HTTPSupervisor, IQSupervisor, FrontendSocketSupervisor, Listener]}} //重启策略为one_for_one(只重启终止的子进程自身),如果1s内重启次数超过10则终止所有子进程和自身
ejabberd_rdbms:start() //启动数据库相关模块
ejabberd_riak_sup:start() //启动riakc
ejabberd_sm:start() //启动ejabberd_sm 作为ejabberd_sup的子进程
cyrsasl:start() //启动cyrsasl
maybe_add_nameservers() //如果运行在windows系统,则添加域名服务器(DNS)地址到erlang系统中
ejabberd_auth:start() //启动auth模块
ejabberd_oauth:start() //启动oauth模块
start_modules() //启动所有节点上的定义在local_config中的模块 [{mod_adhoc,[]}, {mod_announce,[{access,announce}]}, {mod_blocking,[]}, {mod_caps,[]}, {mod_carboncopy,[]}, {mod_client_state,[]}, {mod_configure,[]}, {mod_disco,[]}, {mod_http_bind,[]}, {mod_irc,[]}, {mod_last,[]}, {mod_muc,[{access,muc}, {access_create,muc_create}, {access_persistent,muc_create}, {access_admin,muc_admin}]}, {mod_offline,[{access_max_user_messages,max_user_offline_messages}]}, {mod_ping,[]}, {mod_privacy,[]}, {mod_private,[]}, {mod_pubsub,[{access_createnode,pubsub_createnode}, {ignore_pep_from_offline,true}, {last_item_cache,false}, {plugins,[<<"flat">>,<<"hometree">>,<<"pep">>]}]}, {mod_register,[{welcome_message,[{subject,<<"Welcome!">>}, {body,<<"Hi. Welc"...>>}]}, {ip_access,trusted_network}, {access,register}]}, {mod_roster,[]}, {mod_shared_roster,[]}, {mod_stats,[]}, {mod_time,[]}, {mod_vcard,[{search,false}]}, {mod_version,[]}]
ejabberd_listener:start_listeners() //启动配置文件中的监听器模块
[{{5222,{0,0,0,0},tcp},
ejabberd_c2s,
[{access,c2s},{shaper,c2s_shaper},{max_stanza_size,65536}]},
{{5269,{0,0,0,0},tcp},ejabberd_s2s_in,[]},
{{5280,{0,0,0,0},tcp},
ejabberd_http,
[{captcha,true},
{http_bind,true},
{web_admin,true},
{request_handlers,[{<<"/websocket">>,ejabberd_http_ws}]}]}]
?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]), //打印启动信息
Sup; //返回pid