сервер erlang на порту 6657?

#bash #erlang #erlang-shell #erlang-ports

#bash #erlang #erlang-оболочка #erlang-порты

Вопрос:

Проблема: Я пытаюсь выполнить команду noshell следующим образом и поддерживать работоспособность сервера на порту 6657, но, похоже, это не работает.

run_server.sh

 erl -make
erl -pa ebin/ -noshell -s server main 6657 -s init stop
  

Функция модуля Erlang

 main(Port) ->
    controller:start(),
  

К вашему сведению, в командной строке erlang я могу выполнить команду — server:main(6667)
это работает нормально.

Не могли бы вы, пожалуйста, подсказать мне, что мне нужно изменить в этой команде?

Спасибо вам!

Ответ №1:

Предполагая, что у вас правильное название модуля (вы говорите server в первом фрагменте и chat_server позже), проблема, скорее всего, заключается в том, что -s module function arg1 [...] аргументы отправляются в виде списка атомов, в то время как ваш код требует одного целого числа (как вы сказали, server:main(6657) работает). Вы можете использовать -eval вместо -s :

 erl -pa ebin/ -noshell -eval "server:main(6657)" -s init stop
  
 $ cat a.erl
-module(a).
-compile(export_all).

main(Port) ->
  io:format("~p~n", [Port]).
$ erlc a.erl
$ erl -noshell -pa . -s a main 6657 -s init stop
['6657']
$ erl -noshell -pa . -eval 'a:main(6657)' -s init stop
6657
  

Комментарии:

1.erlang.org/doc/man/erl.html erl -pa ebin/ -noshell -run "server:main(6657)" -s init stop произойдет сбой -запустите Mod [Func [Arg1, Arg2, …]] (флаг инициализации)

2. Упс, я допустил там опечатку. Так и должно быть -eval , не -run . Пожалуйста, смотрите правку.

3. Я могу выполнить эту команду erl -pa ebin/ -noshell -eval "server:main(6657)" -s init stop без сбоев, но сервер работает не все время. Как я могу продолжать запускать сервер на порту 6656? Спасибо @Dogbert и @kevin

4. @Dogbert Я изменил вопрос, указав правильное имя модуля

5. @J4cK Я полагаю, вы ищете -detached и нет -s init stop : erl -pa ebin/ -noshell -detached -eval "server:main(6657)" , НО, если это не просто для игры, вам следует использовать что-то вроде systemd / upstart в рабочей среде, чтобы сервер был должным образом перезапущен, если / когда он выйдет из строя.