查看源码 epmd

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。日志记录最终会在系统日志中,前提是系统日志可用并且配置正确。如果在启动时启动 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> 至少是一个真正的制表符。空格会被忽略。

访问限制

epmd 守护进程接受来自本地主机和远程主机的消息。但是,如果查询来自远程主机,则仅会答复(并执行)查询命令。如果客户端不是与 epmd 实例运行在同一主机上的进程,则尝试注册节点名称始终是错误的。此类请求被认为是恶意的,并且会立即关闭连接。

以下查询被远程节点接受

  • 端口查询,即具有指定名称的节点侦听哪个端口
  • 名称列表,即给出主机上注册的所有名称的列表

要进一步限制访问,必须使用防火墙软件。