为啥我不能在 Windows 中启动命名 Erlang 节点?

Posted

技术标签:

【中文标题】为啥我不能在 Windows 中启动命名 Erlang 节点?【英文标题】:Why can't I start a named Erlang node in Windows?为什么我不能在 Windows 中启动命名 Erlang 节点? 【发布时间】:2010-10-28 20:47:50 【问题描述】:

我正在尝试使用 Windows XP Home 中的 -sname 选项启动一个命名的 Erlang 节点,但是当我运行 erl 时,它会打印出一条很长的错误消息,我不明白,然后退出:

> erl -sname allyourcode
error_logger,2009,5,25,16,20,57,"Protocol: ~p: register error: ~p~n",["in
                                                                             et_tcp",badmatch,error,econnrefused,[inet_tcp_dist,listen,1,net_kernel,s
                                                                                                                                                 tart_protos,4,net_kernel,start_protos,3,net_kernel,init_node,2,net_kernel,
                                                                                                                                                                                                                      init,1,gen_server,init_it,6,proc_lib,init_p_do_apply,3]]
error_logger,2009,5,25,16,20,57,crash_report,[[initial_call,net_kernel,
                                                                     init,['Argument__1'],pid,,registered_name,[],error_info,exit,er
                                                                                                                                           ror,badarg,[gen_server,init_it,6,proc_lib,init_p_do_apply,3],ancestors,[
                                                                                                                                                                                                                           net_sup,kernel_sup,],messages,[],links,[#Port,],dicti
                                                                                                                                                                                                                                                                                 onary,[longnames,false],trap_exit,true,status,running,heap_size,610,st
                                                                                                                                                                                                                                                                                                                                                               ack_size,24,reductions,490],[]]
error_logger,2009,5,25,16,20,57,supervisor_report,[supervisor,local,net
                                                                       _sup,errorContext,start_error,reason,'EXIT',nodistribution,offender,[p
                                                                                                                                                      id,undefined,name,net_kernel,mfa,net_kernel,start_link,[[allyourcode,shortn
                                                                                                                                                                                                                    ames]],restart_type,permanent,shutdown,2000,child_type,worker]]
error_logger,2009,5,25,16,20,57,supervisor_report,[supervisor,local,ker
                                                                       nel_sup,errorContext,start_error,reason,shutdown,offender,[pid,undefined
                                                                                                                                         ,name,net_sup,mfa,erl_distribution,start_link,[],restart_type,permanent
                                                                                                                                        ,shutdown,infinity,child_type,supervisor]]
error_logger,2009,5,25,16,20,57,std_info,[application,kernel,exited,s
                                                                               hutdown,kernel,start,[normal,[]],type,permanent]
"Kernel pid terminated",application_controller,"application_start_failure,kern
                                                  el,shutdown,kernel,start,[normal,[]]"

Crash dump was written to: erl_crash.dump
Kernel pid terminated (application_controller) (application_start_failure,kernel,shutdown,kernel,start,[normal,[]])

我想包含 erl_crash.dump 文件,但我不知道这样做的好方法,因为它很长。

起初,我以为我遇到了防火墙问题,因为我第一次尝试这样做时,我的防火墙询问我是否会授予不同程序的权限,我做到了;但是,即使禁用了我的防火墙,我仍然遇到同样的问题。

使用 -name 似乎也无济于事。

【问题讨论】:

【参考方案1】:

是的,您甚至可能需要重新启动您的操作系统 - 要检查这是否属实,您也可以简单地启动一个具有不同名称的节点,通常最好使用完全限定名称,例如:

erl -name rambo@127.0.0.1 -setcookie KILLER

然后,使用以下命令开始另一个:

erl -name terminator@127.0.0.1 -setcookie KILLER

并尝试 ping 另一个节点:

net_adm:ping('rambo@127.0.0.1')。

您应该会收到一条“乒乓”消息。

下次使用

节点()。

查看所有可见节点。

【讨论】:

我尝试在启动 erl 之前关闭我的所有 cmd 窗口,但这不起作用。按照您的建议重新启动 Windows 后,我能够运行 erl -sname foo。这是否意味着我运行了 erl 进程但我什至不知道? 是的,不要忘记 erlang shell 可能有任意数量的进程在运行,如果不使用 shell 提供的高级功能,可能不清楚还有什么正在/已经在运行,或者如果这些进程中的任何一个没有正确终止,那么就会有进程信息残留。【参考方案2】:

我想你会发现你已经用那个名字启动了一个节点。尝试关闭所有 Erlang 控制台窗口,然后重试。

【讨论】:

【参考方案3】:

    您需要确保您没有使用已注册的名称(当然):这包括 Erlang 已声明的任何名称。

    如果您在同一台机器上但在不同的用户下启动,请确保您的 cookie 相同。

【讨论】:

以上是关于为啥我不能在 Windows 中启动命名 Erlang 节点?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用双冒号在命名空间中前向声明一个类?

为啥我们不能在一个类中声明一个命名空间?

为啥我不能创建在与类定义相同的命名空间中定义的 C++ 类的实例?

为啥我不能为具有相同名称的命名函数表达式中的变量赋值?

为啥我不能从不同命名空间中的朋友类更改类的私有成员?

为啥不能在 Ruby 3 中结合 `...` 和命名参数?