0

例如,我有两个 Erlang 应用程序app1app2. 当每个节点都有自己的配置文件时,我想在三个节点上运行它们。
另外,我需要app1app2.
app1必须在每个节点上运行。app2是所有节点的同一个程序,但只有一个节点同时运行它;其他节点等待当前节点失败的情况下。

运行示例:

节点 1:

erl -sname cp1 config cp1
application:start(app1).
application:start(app2).

节点 2:

erl -sname cp2 config cp2
application:start(app1).
application:start(app2).

节点 3:

erl -sname cp3 config cp3
application:start(app1).
application:start(app2).

由于配置文件中的同步时间(我将此参数设置为 10000)和app2.
为了检查我的程序是否按我的意愿工作,我自己做这件事,这很容易:我可以控制时间,我打开一个带有 3 个终端的终结器,复制粘贴到命令,一切正常。

我的问题是:
我有 3 台电脑。我需要一个节点用于一台计算机。如何为每台自动执行的计算机编写脚本?
我可以将 Erlang 命令插入 bash 脚本吗?最好的方法是什么?我该如何处理同步问题?我可以将同步时间设置为无穷大吗?

cp1 代码:(其他代码相同,只是必须同步更改)

[{kernel,
  [{distributed, [{app2, 2000, [{cp1@dev1, cp2@dev1, cp3@dev1}]}
    ]},
   {sync_nodes_mandatory, [cp2@dev1, cp3@dev1]},
   {sync_nodes_timeout, 10000}
  ]
 }
].

app2.app 代码:

{application, app2,
 [{description, "An OTP application"},
  {vsn, "0.1.0"},
  {registered, []},
  {mod, {app2_app, []}},
  {applications,
   [kernel,
    stdlib,
    app1
   ]},
  {env,[]},
  {modules, []},

  {licenses, ["Apache 2.0"]},
  {links, []}
 ]}.
4

1 回答 1

0

我有 3 台计算机,1 台计算机需要 1 个节点。如何为每台自动执行的计算机编写脚本?

我建议使用工具来生成版本,例如rebar3,该版本包含一个启动脚本,该脚本使用配置文件启动节点。
我还建议在您的情况下激活-heart 标志,或将版本安装为systemd服务。

我可以在 bash 脚本中插入 erlang 命令吗?最好的方法是什么?

您可以使用escript来处理此问题,您可以查看此问题以获取有关如何执行此操作的示例(TL;DR:您可以,但它会启动一个新节点)。

我该如何处理同步问题?我可以将同步时间设置为无穷大吗?

分布式应用程序,是的,您可以将同步时间设置为infinity

于 2020-07-13T08:22:19.047 回答