¿Hay funciones que permitan que un proceso de OTP encuentre el pid de su supervisor?¿Cómo encontrar al supervisor de un proceso de OTP?
Respuesta
Los datos se oculta en el diccionario proceso (de cualquier proceso dio con proc_lib
) bajo la entrada '$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,[]}]
Aquí la línea que nos interesa es {dictionary,[{'$ancestors',[<0.31.0>]},
.
Tenga en cuenta que este es el tipo de cosas que rara vez debe tener alguna razón para usar usted mismo. Hasta donde yo sé, se usa principalmente para manejar la terminación limpia en árboles de supervisión en lugar de la introspección para cualquier código que tenga. Tratar con cuidado.
Una manera más limpia de hacer las cosas sin meterse con las entrañas sensibles de OTP sería hacer que el supervisor pase su propio pid como argumento del proceso al iniciarlo. Esto debería ser mucho menos confuso para las personas que leerán su código.
Sí, parece una buena idea. –
Me gustaría ir con el pase del supervisor pid también. Es más simple de implementar y mantener. –
Si desea hacerlo mal, aquí está nuestra solución:
%% @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. erlang OTP Supervisor estrellarse
- 2. Servidor TCP sin bloqueo que usa los principios de OTP
- 3. Cuándo usar gen_server en aplicaciones Erlang/OTP
- 4. Erlang OTP supervisión de Java aplicación
- 5. Intervalo de reinicio del supervisor de Erlang
- 6. ¿Cómo puedo encontrar el ID de proceso (pid) de un proceso iniciado en Java?
- 7. cómo enviar un mensaje al proceso principal
- 8. usuario incorrecto para supervisor aprondado
- 9. ¿Por qué termina mi supervisor?
- 10. Supervisor - Ejecución de un script en Python tema PYTHONPATH
- 11. Creación de un sistema comercial: Pure Erlang o Erlang/OTP?
- 12. Logging libraries for Erlang/OTP
- 13. ¿Cómo puedo restaurar el estado del proceso después de un bloqueo?
- 14. múltiples comandos dentro de Supervisor - Python/Linux
- 15. ¿Cómo puedo pasar argumentos al ejecutable en nodemon (o node-supervisor)?
- 16. ¿Por qué el supervisor no reconoce los cambios de código?
- 17. Enviar señal al proceso
- 18. Cómo finalizar correctamente un proceso?
- 19. ¿Cómo se conecta un antivirus de Windows al proceso de acceso al archivo?
- 20. cómo ralentizar un proceso?
- 21. Ejecutar la aplicación node.js en la depuración con el supervisor
- 22. Supervisor de Erlang: cómo verificar si todos los trabajadores han respondido
- 23. Buscar todos los hilos de un proceso dado proceso id
- 24. Cómo pasar objetos entre subprocesos al ejecutar un proceso System.Diagnostics
- 25. ¿Cómo rastrear un proceso para llamadas al sistema?
- 26. ¿Cómo encontrar el motivo de un proceso sin registro en Unix?
- 27. Supervisión de la aplicación django virtualenv a través del supervisor
- 28. Error al ejecutar el proceso Guard: no se puede encontrar el método de singularización
- 29. cómo encontrar el proceso que está haciendo con frecuencia?
- 30. ¿Hay un equivalente al Proceso de C#. Comienza en PHP?
Ni idea, pero que yo sepa puede obtener los procesos vinculados y el supervisor es uno de ellos. – ZeissS