Существуют ли функции, которые позволят процессу OTP находить pid своего супервизора?Как найти руководителя процесса OTP?
ответ
Данные скрыты в словаре процесса (любой процесс породившего с proc_lib
) при входе '$ancestors'
:
1> proc_lib:spawn(fun() -> timer:sleep(infinity) end).
<0.33.0>
2> i(0,33,0).
[{current_function,{timer,sleep,1}},
{initial_call,{proc_lib,init_p,3}},
{status,waiting},
{message_queue_len,0},
{messages,[]},
{links,[]},
{dictionary,[{'$ancestors',[<0.31.0>]},
{'$initial_call',{erl_eval,'-expr/5-fun-1-',0}}]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.24.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,6},
{reductions,62},
{garbage_collection,[{min_bin_vheap_size,46368},
{min_heap_size,233},
{fullsweep_after,65535},
{minor_gcs,0}]},
{suspending,[]}]
Здесь линия, которая нас интересует {dictionary,[{'$ancestors',[<0.31.0>]},
.
Обратите внимание, что это тот материал, из-за которого у вас редко бывают причины использовать себя. Насколько я знаю, он в основном используется для обработки чистого завершения в деревьях наблюдения, а не для интроспекции любого кода, который у вас есть. Обращаться осторожно.
Более чистый способ сделать что-то, не возиться с разумными внутренностями OTP, будет , чтобы супервизор передал свой собственный pid в качестве аргумента для процесса при запуске. Это должно быть гораздо менее запутанным для людей, которые прочтут ваш код.
Да, это выглядит неплохо. –
Я бы тоже пошел с проходом диспетчера pid. Его проще внедрять и поддерживать. –
Если вы хотите сделать это так, вот наше решение:
%% @spec get_ancestors(proc()) -> [proc()]
%% @doc Find the supervisor for a process by introspection of proc_lib
%% $ancestors (WARNING: relies on an implementation detail of OTP).
get_ancestors(Pid) when is_pid(Pid) ->
case erlang:process_info(Pid, dictionary) of
{dictionary, D} ->
ancestors_from_dict(D);
_ ->
[]
end;
get_ancestors(undefined) ->
[];
get_ancestors(Name) when is_atom(Name) ->
get_ancestors(whereis(Name)).
ancestors_from_dict([]) ->
[];
ancestors_from_dict([{'$ancestors', Ancestors} | _Rest]) ->
Ancestors;
ancestors_from_dict([_Head | Rest]) ->
ancestors_from_dict(Rest).
- 1. OTP: как контролировать компоненты, отличные от OTP?
- 2. Как реализовать django otp?
- 3. Остановка руководителя Эрланг?
- 4. Проектирование иерархии руководителя Akka
- 5. Позиция руководителя SQL
- 6. Помощник руководителя над Homestead
- 7. Распределенная система: выборы руководителя
- 8. Приложить сеанс iex к запуску процесса elixir/OTP
- 9. Найти идентификатор процесса фонового процесса
- 10. Найти идентификатор процесса имени процесса
- 11. OTP на основе Authenticator на основе OTP
- 12. как перезагрузить весь код otp при разработке приложения otp?
- 13. Как найти текущие детали процесса?
- 14. Как найти pid сиротного процесса
- 15. ASP.NET - Как найти идентификатор процесса?
- 16. Как найти платформу работающего процесса
- 17. Как найти идентификатор дочернего процесса?
- 18. Как определить иерархию актера/руководителя Akka?
- 19. ярлык для «обновления для РУКОВОДИТЕЛЯ»
- 20. Найти имя процесса по его идентификатору процесса
- 21. Архитектура docs/диаграммы OTP?
- 22. Найти полный путь процесса
- 23. Что такое Erlang OTP?
- 24. boost: Как найти идентификатор процесса процесса по имени?
- 25. Как найти имя процесса с помощью процесса ручки в C#
- 26. Google OTP Generation Java
- 27. Каков самый важный атрибут руководителя проекта/руководителя группы, которого вы ожидаете?
- 28. Удалить OTP Box Автоматически
- 29. OTP с пружинной защитой
- 30. Ошибка IMAP - OTP unavailable
Понятия не имею, но AFAIK вы можете получить взаимосвязанные процессы и супервизор один из них. – ZeissS