檢視原始碼 epmd

Erlang Port Mapper Daemon (Erlang 埠對應守護進程)

描述

epmd 命令可用於啟動埠對應守護進程

epmd [-d|-debug] [DbgExtra...] [-address Addresses]
    [-port No] [-daemon] [-relaxed_command_check]

它也可以用於與正在執行的埠對應守護進程進行通訊

epmd [-d|-debug] [-port No] [-names|-kill|-stop Name]

此守護進程充當所有參與分散式 Erlang 計算的主機上的名稱伺服器。當 Erlang 節點啟動時,該節點會有一個名稱,並從主機作業系統核心取得一個位址。名稱和位址會被傳送至在本地主機上執行的 epmd 守護進程。在 TCP/IP 環境中,位址包含 IP 位址和埠號。節點名稱是 Name@Node 格式的原子。 epmd 守護進程的工作是追蹤哪個節點名稱在哪個位址上監聽。因此,epmd 會將符號節點名稱對應到機器位址。

TCP/IP epmd 守護進程只會追蹤 Erlang 節點名稱的 Name(第一部分)。Host 部分(@ 之後的任何內容)在聯繫 epmd 守護進程的節點名稱中是隱含的,Erlang 節點可以連上的 IP 位址也是如此。因此,Erlang 網路要正確運作,必須有連貫且正確的 TCP 命名服務。

注意

在 Windows 上,一個 epmd 執行個體中允許的最大節點數為 60。這是由於目前實作的限制。如果需要更多節點,您應該考慮使用基於 Erlang 的 epmd 實作,例如 Erlang EPMD

  • 啟動埠對應守護進程 - 如果節點要進行分散式處理且沒有執行中的執行個體,則會由命令 erl(1) 自動啟動守護進程。如果自動啟動,必須使用環境變數來變更守護進程的行為;請參閱 環境變數 一節。

    如果未指定引數 -daemon,則 epmd 會以一般程式身分執行,並使用啟動它的 Shell 的控制終端機。通常,它會以守護進程身分執行。

    一般啟動選項在 一般選項 一節中說明。

    DbgExtra 選項在 DbgExtra 選項 一節中說明。

  • 與正在執行的埠對應守護進程通訊 - 由 epmd 程式與正在執行的 epmd 守護進程通訊主要用於偵錯目的。

    不同的查詢在 互動式選項 一節中說明。

一般選項

啟動名稱伺服器時可以使用這些選項。名稱伺服器通常由命令 erl(1) 自動啟動(如果尚未可用),但也可以在系統啟動時啟動。

  • -address List - 讓此 epmd 執行個體僅監聽以逗號分隔的 IP 位址清單和迴路位址(如果尚未指定,則會隱含地將迴路位址新增至清單)。也可以使用環境變數 ERL_EPMD_ADDRESS 設定此選項;請參閱 環境變數 一節。

  • -port No - 讓此 epmd 執行個體監聽預設值 4369 以外的其他 TCP 埠。也可以使用環境變數 ERL_EPMD_PORT 設定此選項;請參閱 環境變數 一節。

  • -d | -debug - 啟用偵錯輸出。指定的 -d 旗標越多,您會取得的偵錯輸出就越多(達到特定限制)。當 epmd 守護進程未以守護進程身分啟動時,此選項最有用。

  • -daemon - 從控制終端機分離啟動 epmd。記錄會進入系統記錄檔 (syslog),前提是系統記錄檔可用且已正確設定。如果 epmd 守護進程在開機時啟動,則絕對會使用此選項。當命令 erl 自動啟動 epmd 時也會使用此選項。

  • -relaxed_command_check - 以放寬的命令檢查啟動 epmd 程式(主要用於回溯相容性)。這會影響以下內容

    • 在放寬的命令檢查下,即使已註冊作用中的節點,也可以從本機使用命令(例如 epmd -kill)來終止 epmd 守護進程。通常,只有節點資料庫為空的守護進程才能使用 epmd -kill 終止。

    • 命令 epmd -stop(以及對 epmd 的對應訊息,可以使用 erl_interface:ei(3) 指定)通常總是會被忽略。這是因為它可能會導致兩個名稱相同的節點同時存在的奇怪情況。節點只會透過關閉與 epmd 的連線來取消註冊,這就是為什麼命令 stop 只打算在偵錯情況下使用。

      啟用放寬的命令檢查後,您可以強制取消註冊使用中的節點。

    也可以在啟動 epmd 之前設定環境變數 ERL_EPMD_RELAXED_COMMAND_CHECK 來啟用放寬的命令檢查。

    只有在互動使用非常有限的系統上,才使用放寬的命令檢查。

DbgExtra 選項

注意

這些選項僅適用於偵錯和測試 epmd 用戶端。它們不應在一般操作中使用。

  • -packet_timeout Seconds - 設定連線在 epmd 超時並關閉連線之前可以處於非作用中狀態的秒數。預設值為 60。

  • -delay_accept Seconds - 為了模擬忙碌的伺服器,您可以在 epmd 收到新連線要求的通知與接受連線之間插入延遲。

  • -delay_write Seconds - 也是模擬忙碌的伺服器。在傳送回覆之前插入延遲。

互動式選項

這些選項會讓 epmd 以互動式命令執行,顯示將查詢傳送至已在執行的 epmd 執行個體的結果。epmd 聯絡人一律位於本機節點上,但如果主機上有多個執行個體使用不同的埠執行,則可以使用 -port 選項來選取執行個體。

  • -port No - 聯絡在指定的 TCP 埠號(預設值為 4369)上監聽的 epmd。也可以使用環境變數 ERL_EPMD_PORT 設定此選項;請參閱 環境變數 一節。

  • -names - 列出目前正在執行的 epmd 中註冊的名稱。

  • -kill - 終止目前正在執行的 epmd

    只有在 epmd -names 顯示空資料庫時,或是在啟動正在執行的 epmd 執行個體時指定 -relaxed_command_check 時,才允許終止正在執行的 epmd

    請注意,-relaxed_command_check 是在啟動將在註冊使用中節點時接受終止的守護進程時指定。以互動方式執行 epmd 時,-relaxed_command_check 沒有任何作用。如果沒有註冊使用中的用戶端,則必須使用信號或其他作業系統特定的方法來終止未啟用放寬的命令檢查而啟動的守護進程。

  • -stop Name - 強制從 epmd 資料庫取消註冊使用中的節點。

    只有在聯絡以旗標 -relaxed_command_check 啟動的 epmd 執行個體時,才能使用此命令。

    請注意,必須為聯絡的 epmd 守護進程啟用放寬的命令檢查。以互動方式執行 epmd 時,-relaxed_command_check 沒有任何作用。

環境變數

  • ERL_EPMD_ADDRESS - 可以設定為以逗號分隔的 IP 位址清單,在這種情況下,epmd 守護進程將只監聽指定的位址和迴路位址(如果尚未指定,則會隱含地將迴路位址新增至清單)。預設行為是監聽所有可用的 IP 位址。

  • ERL_EPMD_PORT - 可以包含 epmd 將使用的埠號。預設埠在大多數情況下都能正常運作。可以指定不同的埠,以允許代表獨立節點叢集的數個 epmd 執行個體在同一主機上共存。叢集中的所有節點都必須使用相同的 epmd 埠號。

  • ERL_EPMD_RELAXED_COMMAND_CHECK - 如果在啟動之前設定,則 epmd 守護進程的行為會如同在啟動時指定了選項 -relaxed_command_check 一樣。因此,如果在啟動 Erlang 虛擬機器之前設定此選項,則自動啟動的 epmd 會接受 -kill-stop 命令,而沒有任何限制。

記錄

在某些作業系統上,當 epmd 以守護進程身分執行時,系統記錄檔 (syslog) 會用於錯誤報告。若要啟用錯誤記錄,您必須編輯 /etc/syslog.conf 檔案並新增一個項目

  !epmd
  *.*<TABs>/var/log/epmd.log

其中 <TABs> 至少是一個實際的 Tab 字元。空格會被無聲地忽略。

存取限制

epmd 守護進程接受來自本機和遠端主機的訊息。但是,只有當查詢來自遠端主機時,才會回覆(並執行)查詢命令。如果用戶端與執行 epmd 執行個體的相同主機上的處理程序不同,則嘗試註冊節點名稱永遠是錯誤。這類要求會被視為惡意,並且會立即關閉連線。

以下查詢會從遠端節點接受

  • 埠查詢,也就是具有指定名稱的節點在哪個埠上監聽
  • 名稱清單,也就是給出主機上註冊的所有名稱清單

若要進一步限制存取,必須使用防火牆軟體。