今天有同事說他機器上的leofs啟動不了。我用console起了一下,發現報如下錯:
{error_logger,{{2015,11,3},{6,23,6}},"Protocol: ~tp: register/listen error: tpn",["inet_tcp",econnrefused]}
{error_logger,{{2015,11,3},{6,23,6}},crash_report,[[{initial_call,{net_kernel,init,['Argument__1']}},{pid,<0.601.0>},{registered_name,[]},{error_info,{exit,{error,badarg},[{gen_server,init_it,6,[{file,"gen_server.erl"},{line,322}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,237}]}]}},{ancestors,[net_sup,kernel_sup,<0.591.0>]},{messages,[]},{links,[#Port<0.1236>,<0.598.0>]},{dictionary,[{longnames,true}]},{trap_exit,true},{status,running},{heap_size,610},{stack_size,27},{reductions,774}],[]]}
{error_logger,{{2015,11,3},{6,23,6}},supervisor_report,[{supervisor,{local,net_sup}},{errorContext,start_error},{reason,{'EXIT',nodistribution}},{offender,[{pid,undefined},{name,net_kernel},{mfargs,{net_kernel,start_link,[['manager_0@192.168.1.132',longnames]]}},{restart_type,permanent},{shutdown,2000},{child_type,worker}]}]}
{error_logger,{{2015,11,3},{6,23,6}},supervisor_report,[{supervisor,{local,kernel_sup}},{errorContext,start_error},{reason,{shutdown,{failed_to_start_child,net_kernel,{'EXIT',nodistribution}}}},{offender,[{pid,undefined},{name,net_sup},{mfargs,{erl_distribution,start_link,[]}},{restart_type,permanent},{shutdown,infinity},{child_type,supervisor}]}]}
...
懷疑是EPMD有問題。嘗試erl,可以正常啟動;嘗試erl -name test@127.0.0.1,報類似的錯誤。
嘗試epmd -debug,得到如下信息:
epmd: Tue Nov 3 09:00:04 2015: epmd running - daemon = 0
epmd: Tue Nov 3 09:00:04 2015: there is already a epmd running at port 4369
嘗試ps axu | grep epmd,沒有發現進程:
root 16308 0.0 0.0 112640 976 pts/6 S+ 09:00 0:00 grep --color=auto epmd
嘗試lsof -i:4369,發現如下進程占用了4369端口:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker 25840 root 4u IPv4 80940 0t0 TCP registry.xxxxxx.com:epmd (LISTEN)
殺掉該進程后,恢復正常。確定了問題是EPMD的默認端口號被其它進程占用導致。解決方案:可以在啟動EPMD時指定其端口號,也可以設置環境變量ERL_EPMD_PORT來指定其端口號。但是這樣治標不治本,合理的做法還是規划好服務器上要啟動的服務及其需要使用的端口號,避免沖突。
關於EPMD的介紹和使用,可以看這里: http://www.erlang.org/doc/man/epmd.html