запуск демона

154 views
Skip to first unread message

Евгений Фарсалов

unread,
Mar 8, 2014, 12:01:31 PM3/8/14
to erlang-...@googlegroups.com
есть модуль. Хочу запустить его в виде демона. При запуске в эрл-шеле работает на ура. При запуске в голой консоли erl -s server listen выбивает ошибку. Типо не может подключиться к сокету...

-module(server).
-export([listen/1]).


-define(TCP_OPTIONS, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]).




% Call echo:listen() to start the server.
listen(Port) ->
{ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
spawn_link(fun() -> accept(LSocket) end).

% Wait for incoming connections and spawn a process that will process incoming packets.
accept(LSocket) ->
{ok, Socket} = gen_tcp:accept(LSocket),
Pid = spawn_link(fun() ->
io:format("Connection accepted ~p ~n", [Socket]),
loop(Socket)
end),
gen_tcp:controlling_process(Socket, Pid),
accept(LSocket).

% Echo back whatever data we receive on Socket.
loop(Sock) ->
inet:setopts(Sock, [{active, once}]),
receive
{tcp, Socket, Data} ->
D=erlang:binary_to_list(Data),
io:format("Got packet: ~p~n", [D]),
%io:format("Test: ~p~n", [[$c,13,10]]),
if
D == [$c,13,10] -> exit(self(), ok) , io:format("test ok ~p~n", [[$u]]);
true -> gen_tcp:send(Socket, Data),
loop(Socket)
end;
{tcp_closed, Socket}->
io:format("Socket ~p closed~n", [Socket]);
{tcp_error, Socket, Reason} ->
io:format("Error on socket ~p reason: ~p~n", [Socket, Reason])
end.

mprize

unread,
Mar 9, 2014, 1:16:53 AM3/9/14
to erlang-...@googlegroups.com
параметр Port преобразуете в число? Он же приходит скорее всего в виде атома или строки при запуске через -s

Евгений Фарсалов

unread,
Mar 9, 2014, 11:18:02 AM3/9/14
to erlang-...@googlegroups.com
Порт захардкоден... без изменений...

воскресенье, 9 марта 2014 г., 8:16:53 UTC+2 пользователь mprize написал:

Danil A. Zagoskin

unread,
Mar 9, 2014, 11:55:36 AM3/9/14
to erlang-...@googlegroups.com
wtf() ->
    Self = self(),
    spawn(fun() ->
                monitor(process, Self),
                receive X -> io:format("Monitor got ~160p~n", [X]) end
        end),
    timer:sleep(200).


$ erl -s server wtf
Erlang R16B02 (erts-5.10.3) [source-b44b726] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.3  (abort with ^G)
1> Monitor got {'DOWN',#Ref<0.0.0.27>,process,<0.2.0>,normal}

Это говорит о том, что процесс, в котором запускается то, что нужно запустить на старте, после выполнения работы умирает с причиной normal.

Из-за этого запущенные через start_link процессы продолжают работать, а порты отмирают, поскольку хозяин мертв.

Как это лечить:
  1. Использовать супервизоры
  2. Использовать приложения для супервизоров из предыдущего пункта
  3. Открывать сокет в том же процессе, где потом работает функция accept
  4. Если совсем неймется, поменять управляющий процесс у первого сокета


9 марта 2014 г., 19:18 пользователь Евгений Фарсалов <booksmast...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес erlang-russia...@googlegroups.com.
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу erlang-...@googlegroups.com.
Дополнительные возможности доступны на странице https://groups.google.com/d/optout.

Евгений Фарсалов

unread,
Mar 13, 2014, 6:38:51 PM3/13/14
to erlang-...@googlegroups.com
спасибо, работает

суббота, 8 марта 2014 г., 19:01:31 UTC+2 пользователь Евгений Фарсалов написал:
Reply all
Reply to author
Forward
0 new messages