运行 N 个 Erlang 节点并使用 bash 脚本在每个节点中执行一行

Posted

技术标签:

【中文标题】运行 N 个 Erlang 节点并使用 bash 脚本在每个节点中执行一行【英文标题】:Running N Erlang nodes and executing a line inside each one with a bash script 【发布时间】:2018-11-18 01:18:42 【问题描述】:

TL;DR:如何向 bash 启动的程序发送一行(并可能在后台运行)?

你好!我已经尝试了很多解决方案,但我无法将它们全部组合成一个有效的解决方案。

我想制作一个运行 N 个 Erlang 节点的 bash 脚本,例如:

for i in 1..N:
    erl -name server$i@127.0.0.1 -setcookie secret

我希望他们通过 ping 另一个节点来“连接”它们。为此,我们可以这样做:

erl -name some_server@127.0.0.1 -setcookie secret
(inside erlang)> net_adm:ping('another_server@127.0.0.1').

但是我不能将这两者结合起来,即使在单个节点上尝试也是如此。

我试过了:

echo "net_adm:ping('another_server@127.0.0.1')." > erlang_command
cat erlang_command - | erl -name some_server@127.0.0.1 -setcookie secret

(i've had partial success with this one, i can run it manually but i couldn't make it to work to run in the background or in another terminal)

xterm -e "echo \"net_adm:ping('another_server@127.0.0.1').\"; cat erlang_command - | erl -name some_server@127.0.0.1 -setcookie secret"

或其他技巧,例如:

echo "net_adm:ping('another_server@127.0.0.1')." | erl -name some_server@127.0.0.1 -setcookie secret

-----

echo "net_adm:ping('another_server@127.0.0.1')." > /dev/stdin
erl -name some_server@127.0.0.1 -setcookie secret

-----

Some uses of nohup and & (can't remember these exactly, but got a similar experience)
nohup erl -name some_server@127.0.0.1 -setcookie secret &

但是,这些要么不起作用,要么无法正确执行 ping 并完成我希望继续运行的 erlang 节点。我错过了什么?谢谢!

【问题讨论】:

【参考方案1】:

将输入管道输入到 erl shell 并不是执行短代码的好方法。要么使用 erl -noshell -name ... -setcookie ... -eval 'rpc:call(another_server@127.0.0.1, MODULE, FUNCTION, [ARGS]).' 之类的东西(用你想做的任何东西替换 MODULE、FUNCTION 和 ARGS),或者如果你想做一些比单行更长的事情,可以写一个 escript;详情请见http://erlang.org/doc/man/escript.html

【讨论】:

以上是关于运行 N 个 Erlang 节点并使用 bash 脚本在每个节点中执行一行的主要内容,如果未能解决你的问题,请参考以下文章

使用 Erlang 的 Elixir 模块失败

如何连接到已注册的节点(Erlang)并从 Ejabberd 使用它

通过桌面图标运行 bash 脚本时找不到节点命令

在 Erlang 中动态添加节点和 global_groups

Erlang 节点只有在 Ping 后才能看到对方

使用 ssh 端口转发运行 Erlang Observer