Супервайзеры - это путь. Вы должны прочитать документы, но инициатор супервизора, подобный этому, загрузит трех идентичных потомков и продолжит их работу:
init([]) ->
MyChildren =
[{list_to_atom(ChildName),
{theworkermodule, start_link, [ChildName]},
permanent, 1000, worker, [theworkermodule]} || ChildName <- [c1,c2,c3]],
{ok, {{one_for_one, 5, 10}, MyChildren}}
Ваше приложение может загружаться этим супервизором, и оно будет поддерживать работу трех ваших дочерних gen_servers (определенных в theworkermodule.erl) - и когда / если один из них умрет, он автоматически перезапустится.