Запуск N узлов Erlang и выполнение строки внутри каждого с помощью bash-скрипта - PullRequest
0 голосов
/ 08 июня 2018

TL; DR: Как отправить строку в программу, запущенную bash (и, возможно, запустить ее в фоновом режиме)?

Здравствуйте!Я попробовал довольно много решений оттуда, но я не смог объединить их все в рабочее решение.

Я хочу сделать скрипт bash, который запускает N узлов Erlang, что-то вроде:

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

И я хочу, чтобы они «соединили» их, пропингуя другой узел.Чтобы сделать это, мы можем сделать:

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 &

Однако они либо не работают, либо правильно выполняют пинг и завершают мой узел erlang, что мне бы хотелосьпродолжать бежать.Что мне не хватает?Спасибо!

1 Ответ

0 голосов
/ 08 июня 2018

Передача входных данных в оболочку erl не является хорошим способом выполнения коротких фрагментов кода.Либо используйте что-то вроде erl -noshell -name ... -setcookie ... -eval 'rpc:call(another_server@127.0.0.1, MODULE, FUNCTION, [ARGS]).' (замените MODULE, FUNCTION и ARGS на то, что вы хотите сделать), или напишите сценарий, если вы хотите сделать что-то немного дольше, чем просто oneliner;подробности см. http://erlang.org/doc/man/escript.html.

...