Извините за мои плохие навыки английского sh.
У меня есть 2 приложения erlang, например app1 и app2, и я хочу запускать их на 3 узлах, когда каждый узел имеет свой файл конфигурации. Кроме того, мне нужно, чтобы приложение app1 запускалось до app2. 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).
Все узлы должны запускаться вместе из-за синхронизации c time (я установил этот параметр на 10000) в файле конфигурации и то же самое для app2. Чтобы убедиться, что моя программа работает так, как я хочу, я делаю это сам, это легко, у меня есть контроль над временем, я открываю терминатор с 3 терминалами, делаю копипасту для команд, и все в порядке.
Мои вопросы: у меня 3 компьютера, мне нужен 1 узел на 1 компьютер. Как написать сценарий для каждого компьютера, который сделает это автоматически? Могу ли я вставить команды erlang в сценарий bash? Как лучше всего это сделать? Как решить проблему с синхронизацией c? Могу ли я установить syn c time на бесконечность?
cp1 code: (то же самое для других, только с изменениями в syn c обязательно)
[{kernel,
[{distributed, [{app2, 2000, [{cp1@dev1, cp2@dev1, cp3@dev1}]}
]},
{sync_nodes_mandatory, [cp2@dev1, cp3@dev1]},
{sync_nodes_timeout, 10000}
]
}
].
app2.app code:
{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, []}
]}.