运行 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)并从 Ejabberd 使用它