1. 程式人生 > >Ejabberd啟動梳理及相關檔案介紹

Ejabberd啟動梳理及相關檔案介紹

啟動流程
ejabberd工程啟動application:start(ejabberd).
ejabberd.erl

start() ->
    %%%ejabberd_cover:start(),
    application:start(ejabberd).

stop() ->
    application:stop(ejabberd).
    %%%ejabberd_cover:stop().

查詢ejabberd.app檔案,並按該檔案指示,啟動ejabberd應用
ejabberd.app.src
檢視ejabberd/src/ejabberd.app.src檔案

{application, ejabberd,
 [{description, "ejabberd"},
  {vsn, "16.12.beta1-48"},
  {modules, []},
  {registered, []},
  {applications, [kernel, stdlib]},
  {env, []},
  {mod, {ejabberd_app, []}}]}.

mod 定義了應用程式的回撥模組和啟動引數,由此可知應用程式啟動時會由主導程序來呼叫這個模組的start/2方法
ejabberd_app.erl

start(normal, _Args) ->
    %%%
啟動lager ejabberd_logger:start(), %%%將當前erlang虛擬機器程序pid寫入EJABBERD_PID_PATH定義檔案中 write_pid_file(), %%%啟動必要應用(例如sasl,ssl,fast_yaml,fast_tls,fast_xml,cache_tab等) start_apps(), %%%啟動elixir應用 start_elixir_application(), %%%檢查ejabberd應用是否正常啟動 ejabberd:check_app(ejabberd), %%%
start() ->ok. randoms:start(), %%%初始化並啟動本地mnesia db_init(), %%%啟動ejabberd程序,loop空迴圈 start(), %%%從環境變數EJABBERD_MSGS_PATH定義的位置找*.msg並載入到ets:translations表(國際化) translate:start(), %%%啟動gen_server訪問控制 ejabberd_access_permissions:start_link(), %%%建立兩張表ets-ejabberd_ctl_cmds,ets-ejabberd_ctl_host_cmds ejabberd_ctl:init(), %%%建立表ets-ejabberd_commands並調整表結構 ejabberd_commands:init(), %%%註冊常用ejabberd_command到表ejabberd_commands ejabberd_admin:start(), %%%建立表ets-ejabberd_modules gen_mod:start(), %%%增加ejabberd modules到code path中 ext_mod:start(), %%%如果elixir的配置被使用,則安裝elixir,否則什麼都不做 setup_if_elixir_conf_used(), %%%讀取配置並生成公鑰(ShareKey) ejabberd_config:start(), %%%根據配置設定日誌級別(level)以及net_ticktime 60s(預設) %%%The frequency of both tick messages and detection of failures %%%is controlled by the net_ticktime configuration setting set_settings_from_config(), %%%建立訪問控制表並根據配置填寫 acl:start(), %%%建立sharpe表並根據配置填寫 shaper:start(), %%%連線叢集其他節點 connect_nodes(), %%%啟動一個supervisor,並啟動和監控定義子程序 Sup = ejabberd_sup:start_link(), %%%啟動資料庫相關模組 ejabberd_rdbms:start(), %%%啟動riak ejabberd_riak_sup:start(), %%%啟動redis ejabberd_redis:start(), %%%啟動ms模組 ejabberd_sm:start(), %%%啟動SASL安全認證模組 cyrsasl:start(), % Profiling %ejabberd_debug:eprof_start(), %ejabberd_debug:fprof_start(), %%%如果執行在windows系統,則新增域名伺服器(DNS)地址到erlang系統中 maybe_add_nameservers(), %%%啟動所有鑑權模組 ejabberd_auth:start(), ejabberd_oauth:start(), %%%動該host的所以modules gen_mod:start_modules(), %%%啟動配置檔案中的監聽器模組 ejabberd_listener:start_listeners(), register_elixir_config_hooks(), ?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]), Sup; start(_, _) -> {error, badarg}.

附:
1.ejabberd_command命令格式

#ejabberd_commands{name = status, tags = [server],
            desc = "Get status of the ejabberd server",
            module = ?MODULE, function = status,
            result_desc = "Result tuple",
            result_example = {ok, <<"The node [email protected] is started with status: started"
                "ejabberd X.X is running in that node">>},
            args = [], result = {res, restuple}}

定義一個status命令,接受引數[],返回{res,restuple}
2.監控程序

Sup = ejabberd_sup:start_link()

該語句負責啟動子程序監控程序,詳細檢視start_link啟動後呼叫的init函式

init([]) ->
    ...
    {ok, {{one_for_one, 10, 1},
      [Hooks,
       NodeGroups,
       SystemMonitor,
       Router,
       Router_multicast,
       S2S,
       Local,
       Captcha,
       S2SInSupervisor,
       S2SOutSupervisor,
       ServiceSupervisor,
       IQSupervisor,
       FrontendSocketSupervisor,
       Listener]}}.

{{one_for_one, 10, 1}表示重啟策略,one_for_one(只重啟終止的子程序自身),如果1s內重啟次數超過10則終止所有子程序和自身(詳細啟動引數可以檢視ejabberd_sup.erl)
檔案介紹
ejabberd.app
在$(INSTALLDIR)/ejabberd/ebin 目錄下,用於配置ejabberd 應用程式的部分資訊,主要提供應用程式可以載入的所有模組名

ejabberd.yml
在/etc/ejabberd/ 目錄下,用於配置ejabberd各種資訊,包括:
◦日誌(LOGGING)
◦節點(NODE PARAMENTERS)
◦主機名(SERVED HOSTNAMES)
◦監聽埠(LISTENING PORTS)
◦S2S全域性配置(S2S GLOBAL OPTIONS)
◦認證方式(AUTHENTICATION)
◦資料庫(DATABASE SETUP)
◦流量控制(TRAFFIC SHAPERS)
◦訪問控制列表(ACCESS CONTROL LISTS)
◦訪問控制規則(ACCESS RULES)
◦預設語言(DEFAULT LANGUAGE)
◦驗證碼(CAPTCHA)
◦模組(MODULES)

ejabberd.erl、 ejabberd_app.erl
在原始碼目錄的src目錄下,程式啟動相關。

gen_mod.erl、 ext_mod.erl
在原始碼目錄的src目錄下,模組載入相關。

mod_*.erl
在原始碼目錄的src目錄下,各種模組的原始碼。

ejabberd_config.erl
在原始碼目錄的src目錄下,管理ejabberd 配置檔案

ejabberd_c2s.erl、ejabberd_sm.erl、ejabberd_socket.erl、ejabberd_listen.erl、ejabberd_router.erl
在原始碼目錄的src目錄下,使用者註冊、登入、訊息收發、訊息路由相關
(後面會針對以上5個檔案模組進行詳細解析)

知識補充(關於.app檔案)

{application, Application,
  [{description,  Description},
   {id,           Id},
   {vsn,          Vsn},
   {modules,      Modules},
   {maxP,         MaxP},
   {maxT,         MaxT},
   {registered,   Names},
   {included_applications, Apps},
   {applications, Apps},
   {env,          Env},
   {mod,          Start},
   {start_phases, Phases},
   {runtime_dependencies, RTDeps}]}.

其中必須配置項description,vsn,modules,registered,applications

相關推薦

Ejabberd啟動梳理相關檔案介紹

啟動流程 ejabberd工程啟動application:start(ejabberd). ejabberd.erl start() -> %%%ejabberd_cover:start(), application:start(

【一】linux安裝redis(單機版)、3種啟動方式、配置檔案介紹

環境ubuntu16.04 解壓 tar -zxvf redis-3.2.6.tar.gz 修改資料夾名稱 mv redis-3.2.6 redis 編譯 cd /app/redis make 編譯好後會看到redis.conf和src檔案 安裝 cd

linux使用者相關檔案介紹

使用者和組檔案介紹     1.使用者賬號檔案:passwd passwd命令用於設定使用者的認證資訊,包括使用者密碼、密碼過期時間等。系統管理者則能用它管理系統使用者的密碼。只有管理者可以指定使用者名稱稱,一般使用者只能變更自己的密碼。 選項 -d:刪除密碼,僅有系統管理者才能使用; -

原 Python資料爬蟲學習筆記(15)Scrapy常見命令專案檔案介紹

一、Scrapy常見命令提示符CMD命令: (1)scrapy -h 檢視指令幫助。 (2)scrapy fetch http://baidu.com 直接爬取特定網頁。 (3)scrapy runspider scrapytest.py  執行特定爬蟲(前提要使用cd

java註解三: .yml 的讀取技巧獲取檔案介紹

轉:https://zhidao.baidu.com/question/437547082212460524.html在spring boot中,簡單幾步,讀取配置檔案(application.yml)中各種不同型別的屬性值:1、引入依賴:<!-- 支援 @Config

4星|《哥倫比亞商學院商業策略課》:重要戰略思想相關案例介紹

哥倫比亞商學院商業策略課 作者是商學院教授,也有管理顧問的從業經驗。書中作者嘗試梳理批判目前的主要戰略思想,並提出自己的理論。 作者認為已有戰略思想的弊端如下:1:波特和BCG都提出了頗具宿命論意味的觀點,認為個體企業和行業的內在結構性特點基本上決定了企業業績,這是不對的;2:雖然《追求卓越》《基業長

ELK(三):Elasticsearch如何安裝相關外掛介紹

安裝步驟 系統準備: 作業系統:CentOS6.4 64bit 軟體版本:JDK8.60 , Elasticsearch1.7.1 具體軟體名稱:jdk-8u60-linux-x64.tar.gz , elasticsearch-1.7.1.tar.

使用者管理相關檔案介紹

【1】使用者管理相關檔案介紹 (1)使用者管理 使用者的屬性 1)使用者名稱 2)口令 3)使用者ID(UID) 4)使用者主目錄(HOME) 5)使用者shell (2)/etc/passwd檔案

AOSP6.0.1 launcher3入門篇-解析DeviceProject.java相關檔案

上一篇文章(AOSP6.0.1 launcher3入門篇—解析launcher.java檔案)描述了launcher3的載入過程,本篇文章記錄hotseat停靠方向和位置、隱藏頁指示器、Folder大小等。 首先介紹建構函式: 找到public DevicePr

vuejs相關工具介紹

輕量級前端mvm的框架 圖片.png 對es6語法的簡單描述 圖片.png 融合了react和angular的優點,元件化和靈活應用和指令,在國際上是一款極有潛力的前端框架。 1.雙向繫結 兩段相加得到後面頁面的渲染,{{message}}是常見頁面模板的渲染方式。 v-model 的意思是將 新建ne

幾種常見的模式識別演算法整理 相關資料介紹和下載

這學期選了門模式識別的課。發現最常見的一種情況就是,書上寫的老師ppt上寫的都看不懂,然後繞了一大圈去自己查資料理解,回頭看看發現,Ah-ha,原來本質的原理那麼簡單,自己一開始只不過被那些看似formidable的細節嚇到了。所以在這裡把自己所學的一些點記錄下來,供備忘,也供參考。 1. K-Near

opencv筆記(一)——名稱空間相關函式介紹

名稱空間  opencv中的C++類和函式都是定義在名稱空間cv之內的,所以有如下opencv函式的兩種呼叫方法:  ex1:  Mat srcImg = cv::imread(“1.jpg”);  ex2:  using namespace cv;  Mat

SpringBoot啟動原理相關流程

一、springboot啟動原理及相關流程概覽 springboot是基於spring的新型的輕量級框架,最厲害的地方當屬自動配

IntelliJ IDEA 之 HelloWorld 專案建立相關配置檔案介紹

在博文「IntelliJ IDEA 的使用介面介紹」中,我們通過建立一個 Static Web 專案大致瞭解了 IntelliJ IDEA 的使用介面。接下來,趁著這個熱乎勁,我們來建立第一個 Java 專案HelloWorld,進入如下介面: 如上圖所示

JavaWeb網上圖書商城完整項目--day03-1.圖書模塊功能介紹相關類創建

class default package ren 書籍 logs main java getc 1 前兩天我們學習了user用戶模塊和圖書的分類模塊,接下來我們學習圖書模塊 圖書模塊的功能主要是下面的功能: 2 接下來我們創建對應的包 我們來看看對應的數據庫表t_bo

展示C代碼覆蓋率的gcovr工具簡單介紹相關命令使用演示樣例

文件夾 mes repo 例如 oid else if dir total down (本人正在參加2015博客之星評選,誠邀你來投票,謝謝:username=zhouzxi">http://vote.blog.csdn.net/blogstar2015

Nginx工作原理相關介紹

handle 利用 ice fff 高並發 解析器 異常 creat 為什麽 Nginx工作原理及相關介紹一、Nginx工作原理與模塊介紹1、Nginx基本工作原理NGINX以高性能的負載均衡器,緩存,和web服務器聞名。Nginx由內核和模塊組成,其中,內核的設計非常微小

VS2010-MFC(對話框:屬性頁對話框相關類的介紹

name sbt simple 兩個 點擊 pct dialog hang pos 轉自:http://www.jizhuomi.com/software/164.html 一 屬性頁對話框的分類 屬性頁對話框想必大家並不陌生,XP系統

以太坊:Dapp相關開發工具介紹

去中心化應用 去中心化應用是可以使使用者和供應商之間直接互動的服務(例如,連線某些市場上的買方和賣方,檔案儲存裡的持有者和儲存者)。以太坊去中心化應用典型地通過HTML/Javascript網路應用與使用者互動,使用Javascript API與區塊鏈通訊。去中心化應用典型地在區塊

keepalived介紹配置檔案詳解

keepalived介紹 Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟體外,還可以作為其他服務(例如:Nginx、Hapr