Erlang:init后在另一个节点上启动gen_server失败

drnojrws  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(191)

我在试图在另一个节点上运行gen_server时遇到了一些问题。

start(FileName) ->
  start_link(node(), FileName).

start_link(ThisNode, FileName) ->
  gen_server:start_link({local, ?MODULE}, ?MODULE, [ThisNode, FileName], []).

init([ThisNode, FileName]) ->
  process_flag(trap_exit, true),
  {ok, Terms} = file:consult(FileName),
  {A1, B1, C1} = lists:nth(1,Terms),
  place_objects(A1, B1, C1).

现在,我想启动多个节点,这些节点将运行相同的gen_server,并以某种方式相互通信,然后使用另一个节点来协调这些通信。(所有这些节点都在我的本地终端上启动)。
所以我用erl -sname bar在一个终端上启动一个新节点,我打算在这个节点上运行gen_server,并在这个节点上编译gen_server模块。然后我启动另一个名为'sup'的节点,我打算用它作为所有其他节点的协调器。如果我在bar上运行命令my_gen_server:start("config_bar.txt").,它会成功返回,但当我在sup上运行命令rpc:call('bar@My-MacBook-Pro', my_gen_server, start, ["config_bar.txt"]).时,它成功地从init方法返回(我通过在日志中检查了这一点),但紧接着,我得到了以下错误:

{ok,<9098.166.0>}
(sup@My-MacBook-Pro)2> =ERROR REPORT==== 21-Feb-2022::11:12:30.443051 ===
** Generic server my_gen_server terminating 
** Last message in was {'EXIT',<9098.165.0>,
                               {#Ref<0.3564861827.2990800899.137513>,return,
                                {ok,<9098.166.0>}}}
** When Server state == {10,10,#Ref<9098.1313723616.3973185546.82660>,
                         'bar@My-MacBook-Pro'}
** Reason for termination ==
** {#Ref<0.3564861827.2990800899.137513>,return,{ok,<9098.166.0>}}

=CRASH REPORT==== 21-Feb-2022::11:12:30.443074 ===
  crasher:
    initial call: my_gen_server:init/1
    pid: <9098.166.0>
    registered_name: my_gen_server
    exception exit: {#Ref<0.3564861827.2990800899.137513>,return,
                     {ok,<9098.166.0>}}
      in function  gen_server:decode_msg/9 (gen_server.erl, line 481)
    ancestors: [<9098.165.0>]
    message_queue_len: 0
    messages: []
    links: []
    dictionary: []
    trap_exit: true
    status: running
    heap_size: 1598
    stack_size: 29
    reductions: 3483
  neighbours:

我似乎不知道是什么原因导致的错误,如果有什么我需要添加到我的gen_server代码来修复它。真的很感激一些帮助这一点!

gorkyyrv

gorkyyrv1#

远程节点中的gen_server链接到为rpc调用创建的临时进程,当这个临时进程退出时的项与normal(rpc调用的实际结果)不同,退出信号传播到gen_server,将其杀死。
您可以使用gen_server:start而不是gen_server:start_link,或者,如果您希望gen_server成为监督树的一部分,请指示其主管生成它:

rpc:call('bar@My-MacBook-Pro',  my_gen_sup, start_child, ["config_bar.txt"]).

相关问题