接上篇(ejabberd16.06源码分析(一) application启动)继续探索ejabberd启动的细节。
ejabberd_app.erl 中的start/2 :
start(normal, _Args) ->
ejabberd_logger:start(), %启动日志记录
write_pid_file(), %判断环境变量EJABBERD_PID_PATH是否存在,如果存在,
则将当前进程标识写到定义的文件中。否则什么都不做。
jid:start(), %创建jid的搜索模式, 存储在ets中,供后续使用
start_apps(), %启动其他的app,包括:sasl、ssl、fast_yaml、fast_tls、fast_xml、stringprep、cache_tab
start_elixir_application(), %判断elixir配置是否使能, 使能则启动elixir,否则什么都不做。
ejabberd:check_app(ejabberd), %检查ejabberd需要的module是否都有,如果没有,则ejabberd退出。
randoms:start(), %启动生成随机数模块
db_init(), %启动mnesia,并初始化。
start(), %以spawn_link方式启动ejabberd进程。loop空循环
translate:start(), %从环境变量EJABBERD_MSGS_PATH定义的位置找*.msg并加载到ets:translations
表中(为了国际化)
ejabberd_ctl:init(), %创建两张ets表,ejabberd_ctl_cmds, ejabberd_ctl_host_cmds
ejabberd_commands:init(), %创建ets表, ejabberd_commands
ejabberd_admin:start(), %注册常用的ejabberd commands
gen_mod:start(), %创建ets表,ejabberd_modules
ext_mod:start(), %增加ejabberd modules到code path中
setup_if_elixir_conf_used(), %if elixir的配置被使用,则安装elixir,否则什么都不做。
ejabberd_config:start(), %获取环境变量EJABBERD_CONFIG_PATH的值,
读取该配置文件的内容, 生成ShareKey
set_settings_from_config(), %根据配置文件的内容, 设置log模块的level值,
并设置net_ticktime的值,默认为60秒。
acl:start(), %创建存储acl的mnesia表, 并从配置文件中加载数据。
shaper:start(), %创建存储shaper的mnesia表, 并从配置文件中加载数据。
connect_nodes(), %从配置文件中读取cluster_nodes的配置, 并连接各节点。
Sup = ejabberd_sup:start_link(), %建立监控进程
ejabberd_rdbms:start(), %从配置文件中读取sql相关配置, 然后开始该模块。
ejabberd_riak_sup:start(), %从配置文件中读取riak相关配置, 然后开始该模块。
ejabberd_redis:start(), %从配置文件中读取redis相关配置, 然后开始该模块。
ejabberd_sm:start(), %启动sm模块
cyrsasl:start(), %启动cyrsasl模块
maybe_add_nameservers(), %如果ejabberd运作在Windows机器上, 获取nameservers并且增加到Erlang
ejabberd_auth:start(), %启动auth模块
ejabberd_oauth:start(), %启动oauth模块
gen_mod:start_modules(), %启动该host的所以modules
ejabberd_listener:start_listeners(), %开始网络监听。
ejabberd_service:start(), %创建ets表,delegated_namespaces和hooks_tmp
register_elixir_config_hooks(), %注册elixir config hooks
Sup;
在start函数中,调用一系列的方法和函数来完成整个应用的启动。