我是新的Erlang。目前,我们正在使用ejabberd进行xmpp服务。 最近,由于一些能力问题,我写了一个分布式的erlange程序。我需要在两台机器之间运行rpc:call。我可以在erl模拟器上成功调用rpc:。但我们目前的系统是使用ejabberdctl来启动ejabberd服务。我检查并尝试修改ejabberdctl文件。但我无法成功添加-setcookie。
ejabberdctl中的代码部分是
ctlexec()
{
CONN_NAME=$1; shift
COMMAND=$@
$EXEC_CMD "$ERL \
$NAME ${CONN_NAME} \
-noinput \
-hidden \
-pa $EJABBERD_EBIN_PATH \
$KERNEL_OPTS \
-s ejabberd_ctl -extra $ERLANG_NODE $COMMAND"
}
最后两行造成的问题:
$KERNEL_OPTS \
-s ejabberd_ctl -extra $ERLANG_NODE $COMMAND"
我认为这个文件之前有过引用,但我不知道从哪里来的。 有谁知道如何将-setcookie abc添加到这个erl命令中? 如果我无法更改ejabberdctl文件或更糟糕的情况,我无法更改当前系统。 即我没有机会将setcookie添加到ejabberd系统。 如何将新节点连接到现有的ejabberd节点(我们当前的系统)。
ejabberd假设首先开始。
答案 0 :(得分:0)
你的鼻子下有一个解决方案。 ctlexec()
如何运作?它运行名为--hidden
的{{1}}节点,设置选项$NAME ${CONN_NAME}
,将$KERNEL_OPTS
插入搜索路径,并使用$EJABBERD_EBIN_PATH
中的一些其他参数调用ejabberd_ctl:start()
。因此$ERLANG_NODE $COMMAND
中必须有-setcookie Cookie
参数,或者$KERNEL_OPTS
中使用默认Cookie。这正是你所需要的。只需将$HOME/.erlang.cookie
替换为您自己的模块,然后使用您已有的-s ejabberd_ctl
和$KERNEL_OPTS
内容。在脚本中搜索$ERLANG_NODE
和$KERNEL_OPTS
包含的线索。
像$ERLANG_NODE
这样的脚本是常用的方式。它非常简单而优雅。您只需运行自己的节点设置它ejabberd_ctl
,这样就不会打扰群集中的其他节点。不要忘记设置一些随机节点名称。连接到应用程序节点,然后执行--hidden
即可。通常有一些模块如rpc:call/4,5
使其更舒适,处理额外的参数等等。