выполнить долгосрочную задачу в отдельном процессе.Пусть этот процесс проинформирует сервер gen_server о ходе выполнения задачи (то есть, если ход задачи может быть отслежен) ИЛИ пусть процесс завершит задачу или завершится неудачно, но, по крайней мере, сообщит gen_server о результатах задачи.
Пусть gen_server связан с процессом, выполняющим эту долгосрочную задачу, и пусть gen_server знает PID или зарегистрированное имя, чтобы в случае сигналов выхода он мог изолировать смерть этого важного процесса от остальных.
handle_info(trigger, State) ->
Pid = spawn_link(?MODULE,some_long_running_task,[State]),
NewState = save_pid(Pid,State),
{noreply, NewState};
handle_info({'EXIT',SomePid,_},State)->
case lookup_pid(State) == SomePid of
false -> %% some other process
{noreply,State};
true ->
%% our process has died
%% what do we do now ?
%% spawn another one ?
%% thats your decision to take
....
....
{noreply,State}
end;
handle_info({finished,TaskResult},State)->
.....%% update state e.t.c.
erlang:send_after(?LOOP_TIME, self(), trigger),
{noreply,NewState}.
some_long_running_task(ServerState)->
....do work
....return results