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